我用wsimport创建了一个soap客户端,我需要将消息中的字符串字段内的xml数据发送到web服务器。我知道我真的不需要在web服务调用中使用cdata,但web服务需要此字段在cdata标记中。jax-ws/wsimport中的cdata
问题是如何去做。
要从wsdl生成代码,我使用jaxws-maven-plugin。 在Maven配置我使用绑定文件
bindingFiles
binding Filebinding.xjb /bindingFile
/bindingFiles
jxb:bindings version="2.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="urn:uniface:applic:services:BRF_IN"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb">
<jxb:globalBindings generateElementProperty="false"/>
<jxb:bindings scd="//element::tns:DATA">
<jxb:javaType
name="String"
parseMethod="de.xyz.CdataConverter.unmarshal"
printMethod="de.xyz.CdataConverter.marshal"
/>
</jxb:bindings>
元帅/ unmarschal看起来像这样:
public class CdataConverter {
private static final Pattern PATTERN = Pattern.compile("((?<=\\<\\!\\[CDATA\\[)[\\S\\s]+(?=\\]\\]\\>))");
private static final String CDATA_START = "<![CDATA[";
private static final String CDATA_END = "]]>";
private final static Logger logger =
Logger.getLogger(LgTestServer.class.getName());
public static String marshal(String input) {
if (input == null) {
return null;
}
PropertyConfigurator.configure(".\\log4j.properties");
logger.info("input --------------------->>>>>>>>\n" + input);
return CDATA_START + input + CDATA_END;
}
public static String unmarshal(String cdatainput) {
if (cdatainput == null) {
return null;
}
Matcher matcher = PATTERN.matcher(cdatainput);
if (matcher.find()) {
return matcher.group();
}
return cdatainput.trim();
}
有了这个,我得到一个[CDATA! [在数据领域,但XML是这样编码的
<![CDATA[<?xml version="1.0" encoding="UTF-8"?>
现在我发现这个在这里(如何做JAXB CDATA): http://odedpeer.blogspot.de/2010/07/jaxb-sun-and-how-to-marshal-cdata.html
,但我不知道如何与Maven插件和wsimport的做到这一点。 我的意思是,我不能编码它必须以任何方式进行配置。
你有什么想法如何做到这一点?
哪个应用服务器您使用的?如果您使用的是WebLogic 12.1.1或GlassFish 3.1.2,那么您可以使用EclipseLink JAXB(MOXy)的@ XmlCDATA扩展:http://blog.bdoughan.com/2010/07/cdata-cdata-run-运行数据运行.html – 2012-03-27 16:39:36
即时通讯使用jboss 5.1.0。我已经阅读你的博客,我想我不能使用@XmlCDATA,因为类,比如你的客户,是由wsimport生成的。 – 2012-03-28 06:45:27
确实没有人有想法吗?还是我以不好的方式问? – 2012-03-30 08:36:12