使用Spring Boot创建SOAP Web服务 - NgDeveloper


使用Spring Boot创建SOAP Web服务:

1. Spring Boot主应用文件:


package com.ngdeveloper;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class CouponApplication {

public static void main(String[] args) {
SpringApplication.run(CouponApplication.class, args);
}
}

2.pom.xml
下面的pom.xml文件包含从xsd文件生成输出目录文件的插件,于是会创建pom.xml,xsd文件,端点然后通过启动spring boot应用程序,您将能够找到生成的其他所需文件。

//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.7
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2019.01.23 at 03:41:28 PM IST
//

  • CouponDetails
  • GetCouponDetailsRequest
  • GetCouponDetailsResponse
  • ObjectFactory
  • package-info

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.ngdeveloper</groupId>
<artifactId>Coupon</artifactId>
<version>1.0</version>
<name>Coupon</name>
<description>Coupon Web service</description>

<properties>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
</dependency>

</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaDirectory>${project.basedir}/src/main/resources/</schemaDirectory>
<outputDirectory>${project.basedir}/src/main/java</outputDirectory>
<clearOutputDir>false</clearOutputDir>
</configuration>
</plugin>
</plugins>
</build>

</project>

为您的请求和响应创建一个xsd文件,
以下coupon-details.xsd文件是请求和响应文件:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://ngdeveloper.com/coupon"
targetNamespace=
"http://ngdeveloper.com/coupon" elementFormDefault="qualified">

<xs:element name=
"GetCouponDetailsRequest">
<xs:complexType>
<xs:sequence>
<xs:element name=
"id" type="xs:int" />
</xs:sequence>
</xs:complexType>
</xs:element>

<xs:element name=
"GetCouponDetailsResponse">
<xs:complexType>
<xs:sequence>
<xs:element name=
"CouponDetails" type="tns:CouponDetails" />
</xs:sequence>
</xs:complexType>
</xs:element>

<xs:complexType name=
"CouponDetails">
<xs:sequence>
<xs:element name=
"id" type="xs:int" />
<xs:element name=
"title" type="xs:string" />
<xs:element name=
"code" type="xs:string" />
</xs:sequence>
</xs:complexType>

</xs:schema>

3.创建端点:

package com.ngdeveloper.ws.endpoints;

import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;

import com.ngdeveloper.CouponDetails;
import com.ngdeveloper.GetCouponDetailsRequest;
import com.ngdeveloper.GetCouponDetailsResponse;

@Endpoint
public class CouponDetailsEndPoint {

@PayloadRoot(namespace = "http://ngdeveloper.com/coupon", localPart = "GetCouponDetailsRequest")
@ResponsePayload
public GetCouponDetailsResponse processCouponDetailsRequest(@RequestPayload GetCouponDetailsRequest request) {
GetCouponDetailsResponse response = new GetCouponDetailsResponse();
CouponDetails couponDetails = new CouponDetails();
couponDetails.setId(request.getId());
couponDetails.setTitle(
"10% OFF on Paytm");
couponDetails.setCode(
"PYTM10");
response.setCouponDetails(couponDetails);
return response;
}
}

4.WebserviceConfig文件:
这个配置文件在spring boot for soap webservice and load the xsd file

package com.ngdeveloper;

import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.ws.config.annotation.EnableWs;
import org.springframework.ws.config.annotation.WsConfigurerAdapter;
import org.springframework.ws.transport.http.MessageDispatcherServlet;
import org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition;
import org.springframework.xml.xsd.SimpleXsdSchema;
import org.springframework.xml.xsd.XsdSchema;

@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
@Bean
public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean(servlet, "/ws/*");
}

@Bean(name =
"coupon")
public DefaultWsdl11Definition defaultCouponWsdl11Definition(XsdSchema couponSchema) {
DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
wsdl11Definition.setPortTypeName(
"CouponPort");
wsdl11Definition.setLocationUri(
"/ws");
wsdl11Definition.setTargetNamespace(
"http://ngdeveloper.com/coupon");
wsdl11Definition.setSchema(couponSchema);
return wsdl11Definition;
}

@Bean
public XsdSchema couponSchema() {
return new SimpleXsdSchema(new ClassPathResource(
"coupon-details.xsd"));
}
}

在application.properties中添加以下行以记录输入请求和输出响应,

logging.level.org.springframework.web=DEBUG
logging.level.org.springframework.ws.client.MessageTracing.sent=DEBUG
logging.level.org.springframework.ws.server.MessageTracing.sent=DEBUG
logging.level.org.springframework.ws.client.MessageTracing.received=TRACE
logging.level.org.springframework.ws.server.MessageTracing.received=TRACE

测试创建的SOAP Web服务:

安装wizdler插件以直接从chrome浏览器测试SOAP Web服务。
您还可以使用SOAP UI工具(此处提供免费和专业工具)
在chrome浏览器中打开wsdl链接,然后单击wizdler图标以传递请求