我使用 wsimport 创建了一个肥皂客户端,我需要将消息中字符串字段内的 xml 数据发送到网络服务器。我知道我真的不需要在 web 服务调用中使用 cdata,但 web 服务需要此字段位于 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>
和 marshal/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 来做到这一点。我的意思是,我无法对此进行编码,它必须以任何方式进行配置。
你有什么想法吗?