2012-03-27 124 views
4

我用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是这样编码的

&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;&#13; 

现在我发现这个在这里(如何做JAXB CDATA): http://odedpeer.blogspot.de/2010/07/jaxb-sun-and-how-to-marshal-cdata.html

,但我不知道如何与Maven插件和wsimport的做到这一点。 我的意思是,我不能编码它必须以任何方式进行配置。

你有什么想法如何做到这一点?

+0

哪个应用服务器您使用的?如果您使用的是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

+0

即时通讯使用jboss 5.1.0。我已经阅读你的博客,我想我不能使用@XmlCDATA,因为类,比如你的客户,是由wsimport生成的。 – 2012-03-28 06:45:27

+0

确实没有人有想法吗?还是我以不好的方式问? – 2012-03-30 08:36:12

回答

8

注释@XmlCDATAread 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的插件(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-插件(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> 
+0

另请参阅http://stackoverflow.com/questions/13183510/moxys-xmlcdata-seems-to-have-no-affect如何使用Eclipse JAXBContextFactory进行配置。尤其是jaxb.properties。 – 2013-03-01 15:53:18