我有以下场景:我必须实现web服务客户端,它将使用不同的wsdl-s为不同的web服务提供者服务。即使是同一个提供者,我也可以支持不同版本的wsdl-s。我们在spring中使用java,因此我想到了spring框架。但是,作为实现的一部分,我似乎必须将wsdl导入到我的项目中,并编写基于作为导入pojo-s一部分的创建的代码。因此,对于不同的提供者,不同的代码没有问题,因为逻辑是不同的。但我更愿意为同一提供者的不同版本使用相同的代码,并避免创建不同版本的pojo-s。所以,我正在寻找类似于python的suds库的东西。在那里,您只需提供特定的wsdl并进行调用。您不需要处理wsdl导入和相同提供者的不同版本的wsdl --只要需要调整ws调用的参数列表即可。更可取的是,如果spring可以做类似的事情--也许我只是没有意识到这一点,因为现在我们正在尝试摆脱Axis和Axis-2。
发布于 2016-02-23 13:23:43
你看过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)在弹簧配置中,
<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或新的提供程序,会发生什么?
我还认为,您可以创建一个工厂,使用适当的封送处理程序初始化wsTemplate。
https://stackoverflow.com/questions/35561331
复制相似问题