Spring Boot整合webservice

Spring Boot整合webservice

  • 前言
  • 1.整合依赖
  • 2.建立暴露接口
    • 2.实现类
  • 3.发布服务
  • 4.查看
  • 打完收工!

前言

工作中遇到的问题,由于下游系统属于第三方系统,使用的是soap webservice,同时也在开发,虽然也发布了一套webservice测试环境,但是我们相同的报文,测试10次能有个50的成功率。而且由于我们特殊的业务要求,测试环境不能单单只请求下游系统的测试环境。所以需要建造一个挡板,暂时mock数据,也可以满足特殊业务要求。


1.整合依赖

在网上查找资料的时候一件很神奇的事情,Spring boot其实是提供了Webservice的相关依赖的,但是看大家使用的很少,反而使用的是cxf-spring-boot-starter-jaxws,先紧跟潮流,后面再研究一下Spring boot提供的这个有什么问题

  • 依赖,这里使用gradle,maven就根据‘:’拆一下就好了。
implementation('org.apache.cxf:cxf-spring-boot-starter-jaxws:3.6.2')

2.建立暴露接口

@WebService(
        name = "TestService", // 暴露服务名称
        targetNamespace = "http://localhost:8080/"// 命名空间,一般是接口的包名倒序
)
public interface TestService {
    @WebMethod
    String test(@XmlElement(
            name = "requestXml",
            required = true,
            nillable = true
    ) String requestXml) throws Exception;
}

XmlElement注解可以给arg生成一个别名,让服务认识这个参数,不加这个注解默认是arg0。

2.实现类

代码如下:

@org.springframework.stereotype.Service
@WebService(serviceName = "TestService", // 与接口中指定的name一致, 都可以不写
        targetNamespace = "http://localhost:8080/", // 与接口中的命名空间一致,一般是接口的包名倒,都可以不用写
        endpointInterface = "com.test.TestService" // 接口类全路径
)
public class TestServiceImpl implements TestService  {
 	@Override
    public String test(String requestXml) {
        return "test";
    }
}

@org.springframework.stereotype.Servicespring的接口


3.发布服务

代码如下:

@Configuration
public class WebServiceConfiguration {
    @Bean("cxfServletRegistration")
    public ServletRegistrationBean<CXFServlet> dispatcherServlet() {
        return new ServletRegistrationBean<>(new CXFServlet(),"/soap/*");
    }

    @Bean(name = Bus.DEFAULT_BUS_ID)
    public SpringBus springBus() {
        return new SpringBus();
    }

    @Bean
    public Endpoint endpoint(TestService testService) {
        EndpointImpl endpoint = new EndpointImpl(springBus(), testService);
        endpoint.publish("/TestService");
        return endpoint;
    }
}

4.查看

这个时候就可以在localhost:8080/soap/TestService?wsdl查看了。由于我是工作的不方便展示,这个就记录一下好了。如果想再发布一个,就再添加一个Endpoint
如下:

	@Bean
    public Endpoint endpoint1(TestService testService) {
        EndpointImpl endpoint = new EndpointImpl(springBus(), testService);
        endpoint.publish("/TestService1");
        return endpoint;
    }

打完收工!