引入依赖
<!-- cxf依赖 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.2.4</version>
</dependency>
创建Service接口
TestService
@WebService() //接口此处也应该使用webservice注解
public interface TestService {
@WebMethod //声明下面的方法是webservice中的一个方法
//返回结果类型是String
@WebResult(name = "String",targetNamespace = "")
public String Test(@WebParam(name="user")String user);
}
创建一个接口实现类 实现上面的接口
TestServiceimpl
@WebService(
serviceName = "TestService", //portType名称,客户端生成代码时为接口名称
targetNamespace = "http://service.demo.webservice.com/", //wsdl命名空间 一般是接口所在包路径的倒序来命名
endpointInterface = "com.webservice.demo.service.TestService" //指定发布webservcie的接口类,此类也需要接入@WebService注解
)
//把实现类注入到spring容器
@Component
public class TestServiceimpl implements TestService {
@Override
public String Test(@WebParam(name="user")String user) {
System.out.println("你好,测试用户:"+user);
return user;
}
}
创建cxf配置类
CxfConfig.java
@Configuration
public class CxfConfig {
@Autowired
private Bus bus;
//导入TestService实例
@Autowired
private TestService testService;
//这里需要注意 由于springmvc 的核心类 为DispatcherServlet
//此处若不重命名此bean的话 原本的mvc就被覆盖了。可查看配置类:DispatcherServletAutoConfiguration
//一种方法是修改方法名称 或者指定bean名称
//这里需要注意 若beanName命名不是 cxfServletRegistration 时,会创建两个CXFServlet的。
//具体可查看下自动配置类:Declaration org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration
//也可以不设置此bean 直接通过配置项 cxf.path 来修改访问路径的
@Bean("cxfServletRegistration")
public ServletRegistrationBean dispatcherServlet() {
//注册servlet 拦截/ws 开头的请求 不设置 默认为:/services/*
return new ServletRegistrationBean(new CXFServlet(), "/ws/*");
}
/** JAX-WS **/
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(bus, testService);
endpoint.publish("/TestService"); //发布地址
return endpoint;
}
}
至此soap web服务发布完成,客户端可以访问http://localhost:8080/ws/TestService?wsdl查看发布是否成功
在客户端动态调用web service接口
@RestController
public class TestController {
@RequestMapping("/test")
public String test(String user){
JaxWsDynamicClientFactory dcf=JaxWsDynamicClientFactory.newInstance();
Client client=dcf.createClient("http://localhost:8080/services/TestService?wsdl");
Object[] objects=new Object[0];
try {
//命名空间,方法
QName qname=new QName("","singleDocument");
objects=client.invoke(qname,user);
System.out.println("返回的数据:"+objects[0]);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return null;
}
}
控制台输出结果: