Spring Boot項目中,調用遺留的SOAP Web Service,方法很簡單,僅需引入spring-boot-starter-web-services。html
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> </dependency>
咱們使用WebServiceTemplate來調用SOAP Service。WebServiceTemplate提供了三類調用方法sendSourceAndReceive、marshalSendAndReceive、sendAndReceive。sendSourceAndReceive方法直接發送和接收XML message;marshalSendAndReceive方法發送、接收結果則爲對象,由配置的Marshaller和Unmarshaller自動轉換;sendAndReceive支持更底層的操做。java
package org.iata.caims.service.ws; import org.springframework.boot.webservices.client.WebServiceTemplateBuilder; import org.springframework.stereotype.Service; import org.springframework.ws.client.core.WebServiceTemplate; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import java.io.StringReader; @Service public class MyService { private static final String DEFAULT_URI = "http://localhost:8080/HelloService"; private static final String MESSAGE = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<ns1:sayHello xmlns:ns1=\"http://webservice.itrunner.org\">\n" + " <ns1:in0>COCO</ns1:in0>\n" + "</ns1:sayHello>"; private final WebServiceTemplate webServiceTemplate; public MyService(WebServiceTemplateBuilder webServiceTemplateBuilder) { this.webServiceTemplate = webServiceTemplateBuilder.setDefaultUri(DEFAULT_URI).build(); } public void sendSourceAndReceive() { StreamSource source = new StreamSource(new StringReader(MESSAGE)); StreamResult result = new StreamResult(System.out); webServiceTemplate.sendSourceAndReceiveToResult(source, result); } public Object marshalSendAndReceive(String uri, Object requestPayload) { return this.webServiceTemplate.marshalSendAndReceive(uri, requestPayload); } }
marshalSendAndReceive是經常使用的方法。您能夠經過閱讀wsdl文件來了解Web Service支持的方法和參數,也可使用SoapUI工具生成request、response XML,而後手工編寫SOAP Domain對象。更簡單的方法是使用maven-jaxb2-plugin插件自動生成。web
<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>0.14.0</version> <executions> <execution> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <generatePackage>org.itrunner.ws</generatePackage> <generateDirectory>${project.basedir}/src/main/java</generateDirectory> <schemaDirectory>${project.basedir}/src/main/resources/wsdl</schemaDirectory> <schemaIncludes> <include>*.wsdl</include> </schemaIncludes> </configuration> </plugin>
如上配置,將wsdl文件放入resources/wsdl文件夾,maven編譯時將在指定包生成全部Web Service方法相關的stub類,其中包括package-info.java、ObjectFactory、request、response,並已配置好XML註解。
package-info.javaspring
@javax.xml.bind.annotation.XmlSchema(namespace = "http://webservice.itrunner.org", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) package org.iata.caims.service.test;
ObjectFactorymaven
import javax.xml.bind.annotation.XmlRegistry; @XmlRegistry public class ObjectFactory { /** * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.itrunner.ws */ public ObjectFactory() { } /** * Create an instance of {@link SayHello } */ public SayHello createSayHello() { return new SayHello(); } /** * Create an instance of {@link SayHelloResponse } */ public SayHelloResponse createSayHelloResponse() { return new SayHelloResponse(); } }
Request
Request類名對應Web Service方法名,屬性對應Web Service參數。ide
import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "in0" }) @XmlRootElement(name = "sayHello") public class SayHello { @XmlElement(required = true, nillable = true) protected String in0; /** * Gets the value of the in0 property. * * @return possible object is {@link String } */ public String getIn0() { return in0; } /** * Sets the value of the in0 property. * * @param value allowed object is {@link String } */ public void setIn0(String value) { this.in0 = value; } }
Responsespring-boot
import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "out" }) @XmlRootElement(name = "sayHelloResponse") public class SayHelloResponse { @XmlElement(required = true, nillable = true) protected String out; /** * Gets the value of the out property. * * @return possible object is {@link String } */ public String getOut() { return out; } /** * Sets the value of the out property. * * @param value allowed object is {@link String } */ public void setOut(String value) { this.out = value; } }
配置WebServiceTemplateBuilde與Jaxb2Marshaller:工具
import org.springframework.boot.webservices.client.HttpWebServiceMessageSenderBuilder; import org.springframework.boot.webservices.client.WebServiceTemplateBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.oxm.jaxb.Jaxb2Marshaller; import org.springframework.ws.client.core.WebServiceTemplate; import static java.time.Duration.ofSeconds; @Configuration public class Config { @Bean public WebServiceTemplate webServiceTemplate(WebServiceTemplateBuilder builder) { return builder.messageSenders(new HttpWebServiceMessageSenderBuilder().setConnectTimeout(ofSeconds(60)).setReadTimeout(ofSeconds(60)).build()).build(); } @Bean public Jaxb2Marshaller jaxb2Marshaller() { Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); marshaller.setContextPath("org.itrunner.ws"); return marshaller; } }
調用Web Service:ui
import org.springframework.boot.webservices.client.WebServiceTemplateBuilder; import org.springframework.oxm.jaxb.Jaxb2Marshaller; import org.springframework.stereotype.Service; import org.springframework.ws.client.core.WebServiceTemplate; @Service public class HelloService { private static final String DEFAULT_URI = "http://localhost:8080/HelloService"; private final WebServiceTemplate webServiceTemplate; public HelloService(WebServiceTemplateBuilder webServiceTemplateBuilder, Jaxb2Marshaller jaxb2Marshaller) { this.webServiceTemplate = webServiceTemplateBuilder.setDefaultUri(DEFAULT_URI) .setMarshaller(jaxb2Marshaller).setUnmarshaller(jaxb2Marshaller).build(); } public SayHelloResponse sayHello(SayHello request) { return (SayHelloResponse) this.webServiceTemplate.marshalSendAndReceive(request); } }
Spring Boot Reference Guide
Spring Boot SOAP Client – WebServiceTemplate Examplethis