我有 WSDL。例如:/sample/hello?wsdl。我想通过在 Spring-ws 中配置来调用服务 web 服务。我将此 wsdl 作为参数传递给 springconfig.xml 中的标签。谁能告诉我如何在 Spring-ws 中使用这个 web 服务。
问问题
62334 次
3 回答
49
1.设置项目依赖
将以下依赖项添加到 pom 文件中:
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.2.5</version>
</dependency>
2.设置Web服务应用上下文
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory" />
<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="contextPath" value="com.yourcomany.model" />
</bean>
<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
<constructor-arg ref="messageFactory" />
<property name="marshaller" ref="marshaller"></property>
<property name="unmarshaller" ref="marshaller"></property>
<property name="messageSender">
<bean
class="org.springframework.ws.transport.http.HttpComponentsMessageSender" />
</property>
<property name="defaultUri"
value="http://<hostname>:<portnumber>/sample/hello" />
</bean>
</beans>
3. 设置映射到您的 SOAP 请求/响应对象的模型类
例如,如果您的 SOAP 请求 XML 看起来像
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xxx="http://yourcomapny.com">
<soapenv:Header/>
<soapenv:Body>
<xxx:InputParameters>
<xxx:paramONE>1</xxx:paramONE>
</xxx:InputParameters>
</soapenv:Body>
</soapenv:Envelope>
并且您的 SOAP 响应 XML 看起来像:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header>
...
</env:Header>
<env:Body>
<xxx:OutputParameters xmlns:xxx="http://yourcompany.com">
<xxx:paramONE>0</xxx:paramONE>
</xxx:OutputParameters>
</env:Body>
</env:Envelope>
相应的类(在您在 marshaller bean 中指定的包下:com.yourcompany.model)将分别是:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "paramONE" })
@XmlRootElement(name = "InputParameters", namespace = "http://yourcompany.com")
public class InputParameters {
@XmlElement(required = true, namespace = "http://yourcompany.com")
private String paramONE;
public String getParamONE() {
return paramONE;
}
public void setParamONE(String paramONE) {
this.paramONE = paramONE;
}
}
和
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "paramONE" })
@XmlRootElement(name = "OutputParameters", namespace = "http://yourcompany.com")
public class OutputParameters {
@XmlElement(required = true, namespace = "http://yourcompany.com")
private BigDecimal paramONE;
public BigDecimal getParamONE() {
return this.paramONE;
}
public void setParamONE(BigDecimal paramONE) {
this.paramONE= paramONE;
}
}
4. 添加对象工厂(在 com.yourcompany.model 包下)以创建请求/响应对象
@XmlRegistry
public class ObjectFactory {
public ObjectFactory() {
}
public InputParameters createYourRequest() {
return new InputParameters();
}
public OutputParameters createYourResponse() {
return new OutputParameters();
}
}
5.创建客户端消费服务
界面:
public interface YourService {
BigDecimal getValue(String paramOne);
}
执行
@Component("yourServiceClient")
public class YourServiceClient implements YourService {
private static final ObjectFactory WS_CLIENT_FACTORY = new ObjectFactory();
private WebServiceTemplate webServiceTemplate;
@Autowired
public YourServiceClient(WebServiceTemplate webServiceTemplate) {
this.webServiceTemplate = webServiceTemplate;
}
@Override
public BigDecimal getValue(String paramOne) {
InputParameters request = WS_CLIENT_FACTORY
.createYourRequest();
request.setParamONE(paramOne);
OutputParameters response = (OutputParameters) webServiceTemplate
.marshalSendAndReceive(request);
return response.getParamONE();
}
}
于 2013-09-12T12:08:28.253 回答
2
@Taoufik Mohdit 答案已完成!!
要构建输入和输出对象,您可以使用Webservice-Client:Spring WS、JAXB 和只有一个 WSDL 文件的常用方法?了解如何自动构建这些对象
于 2013-11-25T11:30:05.693 回答
0
鉴于这个问题仍然存在,我想我会发布一个更新,以反映最新版本的 Spring Web Services 框架和 Spring 一般引入的一些变化:
- Spring Boot 的引入允许利用“starter”POM 来简化您的 Maven 配置。
spring-boot-starter-web-services
Spring-WS有一个特定的启动器 - 没有使用 XML 指定 Spring 配置文件,而是引入了Spring JavaConfig,它提供了一个类型安全的纯 Java 选项来配置 Spring。
- 可以使用 Maven 插件自动生成基于给定 WSDL 文件的请求/响应对象。Spring-WS 示例使用的插件是
maven-jaxb2-plugin
.
WebServiceTemplate
仍然是客户端 Web 服务访问的核心类。有关更多信息,您可以查看有关如何使用 Spring-WS 从我编写的 WSDL 文件开始使用 Web 服务的详细示例。
于 2017-02-27T21:53:25.637 回答