Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cdata in jax-ws / wsimport

I created a soap client with wsimport and i need to send xml data inside of a string field in the message to the webserver. I know that i dont really need to use a cdata in a webservice call but the webservice needs this field to be in cdata tags.

The question is how to do it.

To generate the code from the wsdl i use the jaxws-maven-plugin. in the maven config i use a binding file

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>

and marshal/unmarschal looks like this:

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

With this i get a ![CDATA[ in the data field but the xml is encoded like this

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

Now i found this here (how to do cdata with jaxb): http://odedpeer.blogspot.de/2010/07/jaxb-sun-and-how-to-marshal-cdata.html

but i dont understand how to do this with the maven plugin and wsimport. i mean, i cant code this it has to be configured in any way.

do you have any ideas how to do this?

like image 741
Oliver Dalley Avatar asked Mar 27 '12 16:03

Oliver Dalley


1 Answers

Annotation @XmlCDATA (read more) may be generated automatically by JAXB Annotate Plugin. Binding I use is below.

<?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>
like image 162
artspb Avatar answered Oct 30 '22 19:10

artspb