2012-03-27 6 views
4

Ich habe einen Soap-Client mit wsimport erstellt und ich muss XML-Daten in einem String-Feld in der Nachricht an den Webserver senden. Ich weiß, dass ich nicht wirklich ein cdata in einem Webserviceaufruf benutzen muss, aber das Webservice benötigt dieses Feld, um in cdata Tags zu sein.cdata in jax-ws/wsimport

Die Frage ist, wie es geht.

Um den Code von der WSDL zu generieren, benutze ich das Jaxws-Maven-Plugin. in der Maven-config i eine Bindungsdatei

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> 

und Marschall/unmarschal sieht wie folgt aus:

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(); 
} 

Damit ich eine bekommen [CDATA! [im Datenfeld, aber das XML ist so codiert

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

Nun fand ich das hier (wie cdata mit jaxb zu tun): http://odedpeer.blogspot.de/2010/07/jaxb-sun-and-how-to-marshal-cdata.html

, aber ich verstehe nicht, wie das wsimport mit dem Maven Plugin und zu tun. Ich meine, ich kann das nicht programmieren, es muss in irgendeiner Weise konfiguriert werden.

Haben Sie irgendwelche Ideen, wie Sie das tun?

+0

Welche Anwendungsserver verwenden Sie? Wenn Sie WebLogic 12.1.1 oder GlassFish 3.1.2 verwenden, können Sie die Erweiterung '@ XmlCDATA' von EclipseLink JAXB (MOXy) verwenden: http://blog.bdoughan.com/2010/07/cdata-cdata-run- run-data-run.html –

+0

Ich benutze jboss 5.1.0. Ich habe deinen Blog gelesen und ich denke, ich kann den @ XmlCDATA nicht benutzen, weil die Klassen, wie dein Kunde, von wsimport generiert werden. –

+0

hat wirklich niemand eine Idee? Oder habe ich schlecht gefragt? –

Antwort

8

Annotation @XmlCDATA (read more) können automatisch durch JAXB Annotate Plugin erzeugt werden. Binding verwende ich ist unten.

<?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) Definition:

<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) Definition:

<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

Siehe auch http://stackoverflow.com/questions/13183510/moxys-xmlcdata-seems-to-have-no-effect, wie mit der Eclipse JAXBContextFactory zu konfigurieren. Vor allem die jaxb.properties. –