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。
我有以下场景: 我必须实现 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。