工作中遇到的问题,由于下游系统属于第三方系统,使用的是soap webservice
,同时也在开发,虽然也发布了一套webservice
测试环境,但是我们相同的报文,测试10次能有个50的成功率。而且由于我们特殊的业务要求,测试环境不能单单只请求下游系统的测试环境。所以需要建造一个挡板,暂时mock
数据,也可以满足特殊业务要求。
在网上查找资料的时候一件很神奇的事情,
Spring boot
其实是提供了Webservice
的相关依赖的,但是看大家使用的很少,反而使用的是cxf-spring-boot-starter-jaxws
,先紧跟潮流,后面再研究一下Spring boot
提供的这个有什么问题
implementation('org.apache.cxf:cxf-spring-boot-starter-jaxws:3.6.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。
代码如下:
@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.Service
是spring
的接口
代码如下:
@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;
}
}
这个时候就可以在localhost:8080/soap/TestService?wsdl
查看了。由于我是工作的不方便展示,这个就记录一下好了。如果想再发布一个,就再添加一个Endpoint
如下:
@Bean
public Endpoint endpoint1(TestService testService) {
EndpointImpl endpoint = new EndpointImpl(springBus(), testService);
endpoint.publish("/TestService1");
return endpoint;
}