首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java服务框架

Java服务框架
EN

Stack Overflow用户
提问于 2016-02-22 18:40:54
回答 1查看 130关注 0票数 0

我有以下场景:我必须实现web服务客户端,它将使用不同的wsdl-s为不同的web服务提供者服务。即使是同一个提供者,我也可以支持不同版本的wsdl-s。我们在spring中使用java,因此我想到了spring框架。但是,作为实现的一部分,我似乎必须将wsdl导入到我的项目中,并编写基于作为导入pojo-s一部分的创建的代码。因此,对于不同的提供者,不同的代码没有问题,因为逻辑是不同的。但我更愿意为同一提供者的不同版本使用相同的代码,并避免创建不同版本的pojo-s。所以,我正在寻找类似于python的suds库的东西。在那里,您只需提供特定的wsdl并进行调用。您不需要处理wsdl导入和相同提供者的不同版本的wsdl --只要需要调整ws调用的参数列表即可。更可取的是,如果spring可以做类似的事情--也许我只是没有意识到这一点,因为现在我们正在尝试摆脱Axis和Axis-2。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-23 13:23:43

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

代码语言:javascript
复制
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)在弹簧配置中,

代码语言:javascript
复制
<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并添加包信息

代码语言:javascript
复制
@javax.xml.bind.annotation.XmlSchema(
        namespace = "....")
package com.mycompany.app.ws;

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

代码语言:javascript
复制
@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)在您的代码中执行以下操作:

代码语言:javascript
复制
WsResponse wsResponse = (WsResponse ) 
 wsTemplate.marshalSendAndReceive(wsRequest_);

如果需要添加新的wsdl或新的提供程序,会发生什么?

  • 您可以重用pojos :您可以创建另一个包(用于名称空间更改),并创建一个扩展wsRequest2的类wsRequest。
  • 您需要在spring配置中定义一个新的wsTemplate和封送程序。

我还认为,您可以创建一个工厂,使用适当的封送处理程序初始化wsTemplate。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35561331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档