Java Web 服务框架

Java Web Services framework

我有以下场景: 我必须实现 Web 服务客户端,该客户端将为具有各种 wsdl-s 的不同 Web 服务提供商提供服务。即使是同一个提供者也可能具有我必须支持的不同版本的 wsdl-s。 我们正在使用 java 和 spring,因此我在考虑 spring-ws 框架。但似乎,作为实施的一部分,我必须将 wsdl 导入到我的项目中,并根据 created as part of import pojo-s 编写代码。因此,不同提供商的不同代码没有问题,因为逻辑不同。但我更喜欢为同一提供者的不同版本使用相同的代码,并避免创建不同版本的 pojo-s。 所以,我正在为 python 寻找类似于 suds 库的东西。在那里,您只需提供特定的 wsdl 并拨打电话。您不处理 wsdl 导入和同一提供者的不同版本的 wsdl - 只需要在需要时调整 ws 调用的参数列表。 最好,如果 spring-ws 可以做类似的事情——也许我只是没有意识到这一点,因为现在我们正试图摆脱 Axis 和 Axis-2。

你看过 webServiceTemplate 了吗?您有很多可能性,不,您不需要每次都导入 wsdl。例如,您可以使用这样的字符串:

StreamSource source = new StreamSource(new StringReader(....));
ByteArrayOutputStream  bytArrayOutputStream = new ByteArrayOutputStream();
StreamResult result = new StreamResult(bytArrayOutputStream);
wsTemplate.sendSourceAndReceiveToResult(source, result); 
final String reply = new String(_bytArrayOutputStream.toByteArray());

但是这个解决方案并不适合长运行。我会建议而不是像这样使用 pojos

1) 在spring配置中,

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

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

2) 创建包 com.mycompany.app.ws 并添加包信息

@javax.xml.bind.annotation.XmlSchema(
        namespace = "....")
package com.mycompany.app.ws;

3) 在包 com.mycompany.app.ws 中,您需要定义请求和响应。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {})
@XmlRootElement(name = "WsRequest")
public final class WsRequest{
    @XmlElement(required = true)
    private String requstData;
}


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {})
@XmlRootElement(name = "WsResponse")
public final class WsResponse {
    @XmlElement(required = true)
    private String responseData;
}

4) 在您的代码中执行以下操作:

WsResponse wsResponse = (WsResponse ) 
 wsTemplate.marshalSendAndReceive(wsRequest_);

如果您需要添加新的 wsdl 或新的提供者会怎样?

  • 您可以重用 pojos:您可以创建另一个包(用于命名空间更改)并创建一个扩展 wsRequest
  • 的 class wsRequest2
  • 您需要在 spring 配置中定义一个新的 wsTemplate 和 marshaller

我还认为您可以创建一个工厂来使用适当的编组器初始化 wsTemplate。