gpt4 book ai didi

java - 使用 WSDL 和 codehaus jaxb2 的 Spring Soap Web 服务客户端;需要 XmlRootElement 吗?

转载 作者:行者123 更新时间:2023-11-30 02:56:08 25 4
gpt4 key购买 nike

我正在现有的 Spring Web 应用程序中工作;我需要编写代码来调用提供 WSDL 的 SOAP Web 服务。我也使用 Netbeans,不过我愿意在更容易的时候跳到命令行。

我已经为该项目配置了 Maven pom,以包含 codehaus jaxb2-maven-plugin,并编写了一个小测试程序来发送请求。执行该调用时,我收到一条错误消息,指出它无法处理生成的类之一,因为它没有 XmlRootElement 注释。

在进一步搜索该错误时,我发现了很多有关该错误信息的请求,但没有一个适用。他们中的大多数人使用不同的 JaxB 库,并且他们都给了我如何配置他们的插件的示例,而不是我的插件。

我想我可以更改插件(我已经有过一次),但我真正想要的是找到一些关于这个插件的像样的文档。我需要一些可以在Java 7而不是8上完成的东西,不涉及Spring 4(或5或6),最好只是对可以提供给maven插件和/或命令行的各种选项的解释生成类,以便 Spring 的默认类可以对它们进行编码和解码。

---编辑

这就是我现在所拥有的;因为它是测试代码,所以我只是在代码中声明并设置了编码器,而不是配置:

public class XClient extends WebServiceGatewaySupport {
public GetXResponse getXResponse(GetX XRequest) {
// do in configuration for production...
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("com.X.pics.service");
setMarshaller(marshaller);
setUnmarshaller(marshaller);

String uri = "https://site.X.com/services/X";
WebServiceTemplate template = getWebServiceTemplate();
Object response = template.marshalSendAndReceive(uri,
XRequest
);
GetXResponse getXResponse = (GetXResponse) response;
return getXResponse;
}

}

当我运行我的程序时,它给出以下内容(仅第一行):

org.springframework.oxm.MarshallingFailureException: JAXB marshalling exception; nested exception is javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.internal.SAXException2: unable to marshal type "com.xo.pics.service.GetPricing" as an element because it is missing an @XmlRootElement annotation]
at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:237)
at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:322)
at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:483)

我加入了关于更喜欢 Spring 库的行,因为 SO 上的很多答案似乎都采取“更改为这个工具/库”的形式,而不是因为我认为它不能在 Spring 中完成。一旦我弄清楚(或被告知)如何配置和使用 Spring 中的编码器,我会很高兴。

最佳答案

我终于成功了;看起来确实应该更容易。

JAXB Maven 插件的 POM 文件条目现在如下所示:

        <plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<sourceType>wsdl</sourceType>
<sources>
<source>C:/projects/gw/src/main/resources/wsdl/xo2.wsdl</source>
</sources>
<extension>true</extension>
<xjbSources>
<xjbSource>bindings.xjb</xjbSource>
</xjbSources>
</configuration>
</plugin>

我面临的困难之一是缺乏有关此处选项的文档;我最终查看了插件代码中的 jar 文件,并在那里找到了 jaxb2-maven-plugin.pom,并查看了未格式化的文档以了解各种选项。这就是我发现“sourceType”、“sources”和“xjbSources”标签的方式。它还查看了 .m2 目录的该部分,帮助我了解了可用的不同版本,并且网络上可用的文档确实警告您 1.x 和 2.x 之间的主要差异。

无论如何,我找到了以下绑定(bind)文件,但直到后来才确定如何在此版本的插件中指定绑定(bind)文件:

<?xml version="1.0"?>
<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc"
jxb:extensionBindingPrefixes="xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:bindings>
<jxb:globalBindings>
<xjc:simple/>
</jxb:globalBindings>
</jxb:bindings>
</jxb:bindings>

绑定(bind)中的规范导致生成的源中出现@XmlRootElement;如果您的 WSDL 具有已定义名称的复杂类型,则需要此选项。

然后我的客户归结为:

public class XOClient extends WebServiceGatewaySupport {
public GetPricingResponse getPricingResponse(GetPricing pricingRequest) {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setClassesToBeBound(GetPricing.class, GetPricingResponse.class);
setMarshaller(marshaller);
setUnmarshaller(marshaller);


String uri = "https://blah.blah.blah.com/services/pricing";
Object o = getWebServiceTemplate().marshalSendAndReceive(uri, pricingRequest);
GetPricingResponse response = (GetPricingResponse)o;
return response;
}
}

在最终的 Spring 应用程序中,我更有可能配置编码器 URI 和绑定(bind)类,而不是编写代码来设置它们,但在我的小测试程序中使用这会更容易。

因此,这允许我构建定价请求对象并返回 GetPricingResponse 对象,并类似地使用任何其他 API 方法。

希望这对其他人有帮助。

关于java - 使用 WSDL 和 codehaus jaxb2 的 Spring Soap Web 服务客户端;需要 XmlRootElement 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37174931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com