Spring Boot SOAP Client – WebServiceTemplate 案例

  • Post author:
  • Post category:其他




建议大家在开始webservice相关学习时,先了解一下xml、xsd、soap、wsdl相关的知识点,我自身对这方面也不是很了解,有这方面大神的欢迎在评论区留言交流!!



【继上文完成soap webservice的demo后,本篇文章完成soap webclient的说明】:



1. SpringBoot Soap Client技术栈

  1. JDK 1.8
  2. SpringBoot
  3. maven-jaxb2-plugin



2. 具体操作



1. 在pom.xml中添加dependency和plugin

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web-services</artifactId>
		</dependency>
            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.13.2</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <generatePackage>com.qs.webclient.xml.student</generatePackage>
                    <generateDirectory>${project.basedir}/src/main/java</generateDirectory>
                    <schemaDirectory>${project.basedir}/src/main/resources/wsdl</schemaDirectory>
                    <schemaIncludes>
                        <include>*.wsdl</include>
                    </schemaIncludes>
                </configuration>
            </plugin>



2. resource文件下访问webService的wsdl文件

(见第九步 项目目录截图说明)

jaxb2插件与wsdl文件都弄好之后,执行该jaxb2插件,生成类



3. 使用WebServiceTemplate创建SOAP Client

创建一个名为SOAPConnector.java的类,它将作为所有请求WebService的Client

package com.qs.webclient.soap;

import org.springframework.ws.client.core.support.WebServiceGatewaySupport;

/**
 * 对Web Service的所有请求的通用Web Client
 *
 * @author QuS
 * @date 2022/3/17 14:54
 */
public class SOAPConnector extends WebServiceGatewaySupport {

    public Object callWebService(String url, Object request) {

        return getWebServiceTemplate().marshalSendAndReceive(url, request);

    }

}

  1. getWebServiceTemplate()将获得WebServiceTemplate;
  2. 使用WebServiceTemplate去调用SOAP service;
  3. 该类也需要设置Marshaller 和Unmarshaller,我们可以通过配置类的方式将其注入。



4. Spring bean的配置类

配置一些SOAPConnector需要的bean,从而让它可以正常工作。

package com.qs.webclient.config;

import com.qs.webclient.soap.SOAPConnector;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;

/**
 * @author QuS
 * @date 2022/3/17 14:57
 */
@Configuration
public class SoapClientConfig {

    @Bean
    public Jaxb2Marshaller marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setContextPath("com.qs.webclient.xml.student");
        return marshaller;
    }

    @Bean
    public SOAPConnector soapConnector(Jaxb2Marshaller marshaller) {
        SOAPConnector client = new SOAPConnector();
        client.setDefaultUri("http://localhost:9081/service/student-details");
        client.setMarshaller(marshaller);
        client.setUnmarshaller(marshaller);
        return client;
    }
}
  1. WebServiceGatewaySupport 需要Marshaller和Unmarshaller,他们都是Jaxb2Marshaller 的实例;
  2. 使用”com.qs.webclient.xml.student”作为JAXB基础包去创建JAXB context;



5. 使用CommandLineRunner简单测试

package com.qs.webclient;

import com.qs.webclient.soap.SOAPConnector;
import com.qs.webclient.xml.student.StudentDetailsRequest;
import com.qs.webclient.xml.student.StudentDetailsResponse;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class WebclientApplication {

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


    @Bean
    CommandLineRunner lookup(SOAPConnector soapConnector) {
        return args -> {
            String name = "小明";//Default Name
            if (args.length > 0) {
                name = args[0];
            }
            StudentDetailsRequest request = new StudentDetailsRequest();
            request.setName(name);
            StudentDetailsResponse response = (StudentDetailsResponse) soapConnector.callWebService("http://localhost:9081/service/student-details", request);
            System.out.println("Got Response As below ========= : ");
            System.out.println("Name : " + response.getStudent().getName());
            System.out.println("Standard : " + response.getStudent().getStandard());
            System.out.println("Address : " + response.getStudent().getAddress());
        };
    }
}



6. 在application.properties 添加如下配置

logging.level.org.springframework.ws=TRACE

这样,在控制台上将打印出send和response的日志消息,以便于检测。



7. 启动springboot直接调用



8. 输出

2022-03-17 17:19:07.558 DEBUG 1388 --- [           main] o.s.ws.client.core.WebServiceTemplate    : Opening [org.springframework.ws.transport.http.HttpUrlConnection@765df79d] to [http://localhost:9081/service/student-details]
2022-03-17 17:19:07.596 TRACE 1388 --- [           main] o.s.ws.client.MessageTracing.sent        : Sent request [<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><ns2:StudentDetailsRequest xmlns:ns2="http://www.howtodoinjava.com/xml/school"><ns2:name>小明</ns2:name></ns2:StudentDetailsRequest></SOAP-ENV:Body></SOAP-ENV:Envelope>]
2022-03-17 17:19:07.615 TRACE 1388 --- [           main] o.s.ws.client.MessageTracing.received    : Received response [<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><ns2:StudentDetailsResponse xmlns:ns2="http://www.howtodoinjava.com/xml/school"><ns2:Student><ns2:name>小明</ns2:name><ns2:standard>123</ns2:standard><ns2:address>北京朝阳区</ns2:address></ns2:Student></ns2:StudentDetailsResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>] for request [<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><ns2:StudentDetailsRequest xmlns:ns2="http://www.howtodoinjava.com/xml/school"><ns2:name>小明</ns2:name></ns2:StudentDetailsRequest></SOAP-ENV:Body></SOAP-ENV:Envelope>]
Got Response As below ========= : 
Name : 小明
Standard : 123
Address : 北京朝阳区



9. 项目目录截图说明

在这里插入图片描述