cdata в jax-ws / wsimport - PullRequest
       42

cdata в jax-ws / wsimport

4 голосов
/ 27 марта 2012

Я создал мыльный клиент с помощью wsimport, и мне нужно отправить данные XML внутри строкового поля в сообщении на веб-сервер.Я знаю, что мне действительно не нужно использовать cdata в вызове веб-сервиса, но веб-сервису нужно, чтобы это поле было в тегах cdata.

Вопрос в том, как это сделать.

Чтобы сгенерироватькод из WSDL я использую плагин jaxws-maven-.В конфигурации 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;

Теперь я нашел это здесь (как сделать cdata с помощью jaxb): http://odedpeer.blogspot.de/2010/07/jaxb-sun-and-how-to-marshal-cdata.html

но я не понимаюкак это сделать с помощью плагина maven и wsimport.Я имею в виду, я не могу кодировать это, он должен быть настроен любым способом.

У вас есть идеи, как это сделать?

1 Ответ

8 голосов
/ 07 декабря 2012

Аннотация @XmlCDATA ( подробнее ) может быть сгенерирована автоматически 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>
...