我使用wsimport创建了一个soap客户端,我需要将消息中字符串字段内的xml数据发送到Web服务器。我知道我不需要在webservice调用中使用cdata,但webservice需要这个字段在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执行此操作。 我的意思是,我无法编码,必须以任何方式进行配置。
你有什么想法怎么做?
答案 0 :(得分:8)
注释@XmlCDATA
(read more)可能由JAXB Annotate Plugin自动生成。我使用的绑定如下。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
jaxb:version="2.1"
xmlns:annox="http://annox.dev.java.net"
jaxb:extensionBindingPrefixes="annox">
<!--Choose one-->
<!--wsimport--><jaxb:bindings schemaLocation="service.wsdl#types?schema1" node="/xs:schema">
<!--wsdl2java--><jaxb:bindings schemaLocation="service.wsdl#types1" node="/xs:schema">
<jaxb:bindings node="//xs:complexType[@name='RegisterPaymentRequest']/xs:sequence/xs:element[@name='returnURL']">
<annox:annotate target="field">
<annox:annotate annox:class="org.eclipse.persistence.oxm.annotations.XmlCDATA"/>
</annox:annotate>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
jaxws-maven-plugin(wsimport)定义:
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>generate-sources-service</id>
<phase>generate-sources</phase>
<configuration>
<sourceDestDir>${project.basedir}/src/main/java</sourceDestDir>
<bindingDirectory>${project.basedir}/src/main/resources</bindingDirectory>
<bindingFiles>
<bindingFile>binding.xjb</bindingFile>
</bindingFiles>
<wsdlDirectory>${project.basedir}/src/main/resources</wsdlDirectory>
<wsdlFiles>
<wsdlFile>service.wsdl</wsdlFile>
</wsdlFiles>
<xjcArgs>
<xjcArg>-Xannotate</xjcArg>
</xjcArgs>
</configuration>
<goals>
<goal>wsimport</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics-annotate</artifactId>
<version>0.6.4</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.4.0</version>
</dependency>
</dependencies>
</plugin>
cxf-codegen-plugin(wsdl2java)定义:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>2.5.5</version>
<executions>
<execution>
<id>generate-sources-service</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.basedir}/src/main/java</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>
${project.basedir}/src/main/resources/service.wsdl
</wsdl>
<extraargs>
<extraarg>-xjc-Xannotate</extraarg>
<extraarg>-b</extraarg>
<extraarg>
${project.basedir}/src/main/resources/binding.xjb
</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>annotate</artifactId>
<version>0.4.1.5</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.4.0</version>
</dependency>
</dependencies>
</plugin>