使用Spring WebService模板获取原始XML响应

7
我正在编写一个客户端,使用webserviceTemplate(spring-ws)来调用SOAP webservice。 我正在使用JAXB将wsdl转换为POJO。 我将请求发送作为POJO到webservice,但是希望响应以xml格式返回(原始xml而不是反序列化的pojo格式)。
wsTemplate.marshalSendAndReceive(requestPayload)会给我反序列化的pojo对象作为输出,但是我需要来自webservice调用的原始xml响应。
还有一个问题,如果我将响应定义为原始xml,那么我是否仍然需要定义marshaller bean:
<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"/>

<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="contextPath" value="com.abc.xyz" />
</bean>

当我定义这个marshaller时,我遇到了错误:无法将类型"com.abc.xyz.GetAbc"作为元素进行编组,因为它缺少@XmlRootElement注释

需要帮助。

1个回答

8
也许对你来说已经太晚了,但是要将POJO转换回XML,可以使用以下方法:
final Result marshallerResult = new StringResult();
marshaller.marshal(input, marshallerResult);

这里的marshaller是您在wsTemplate中使用的那个。

<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="contextPath" value="com.dhl.dctservice" />
</bean>

<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">     
    <property name="marshaller" ref="marshaller" />
    <property name="unmarshaller" ref="marshaller" />
</bean>

StringResult源自org.springframework.xml.transform包。

我正在使用maven插件从WSDL生成POJO。

<!-- WSDL -> Java (start) -->
<plugin>
    <!-- !!! READ !!! -->
    <!-- mvn cxf-codegen-plugin:wsdl2java NOT working, comment phase and
    run "mvn clean install -DskipTests") -->
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>${cxf-codegen-plugin.version}</version>
    <executions>
        <execution>
            <id>wsdl2java</id>
            <!-- comment this to generate java classes from wsdl during the "mvn
            clean install -DskipTests" -->
            <phase>manual-generate-sources</phase>
            <configuration>
                <wsdlOptions>
                    <wsdlOption>
                        <wsdl>${basedir}/src/main/resources/wsdl/service.wsdl</wsdl>
                        <extraargs>
                            <extraarg>-verbose</extraarg>
                            <extraarg>-b</extraarg>
                            <extraarg>${basedir}/src/main/resources/wsdl/bindings.xml</extraarg>
                            <extraarg>-client</extraarg>
                            <extraarg>-xjc-Xts</extraarg>
                        </extraargs>
                    </wsdlOption>
                </wsdlOptions>
            </configuration>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.codehaus.woodstox</groupId>
            <artifactId>stax2-api</artifactId>
            <version>3.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-xjc-ts</artifactId>
            <version>2.2.12</version>
        </dependency>
        <dependency>
            <groupId>org.jvnet.jaxb2_commons</groupId>
            <artifactId>jaxb2-basics-jaxb-xjc</artifactId>
            <version>2.1.13</version>
        </dependency>
    </dependencies>
</plugin>
<!-- WSDL -> Java (end) -->

这里指的是 binding.xml 文件所在的位置。

<jaxb:bindings
    version="2.1" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <jaxb:globalBindings generateElementProperty="false">
        <xjc:simple />
    </jaxb:globalBindings>

</jaxb:bindings>

4
已点赞,但我阅读此内容的原因是我想存储输入的XML以解决与外部来源可能发生的未来争端。因此,我需要在取消编组之前获得确切的字节,以防出现任何编码/排序差异。 - slim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接