pom依赖:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<!--webservice-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.6</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.6</version>
</dependency>

【1】服务端

需要注意的是方法参数与返回结果不要使用泛型,如果可以请尽量使用String并自己对参数进行格式化转换!

① UserWebService

定义service接口

import javax.jws.WebService;

@WebService(name = "UserWebService", // 暴露服务名称
targetNamespace = "http://cxf.webservice.com"// 命名空间,一般是接口的包名倒序
)
public interface UserWebService {
//根据ID获取用户信息
String getUserById(Long id);
//更新用户信息,参数为json格式
String updateUser(String updateUser);
}

② UserWebServiceImpl

定义service服务实现类,这里服务实现userMapper采用的mybatis。

@WebService(serviceName = "UserWebService", // 与接口中指定的name一致
targetNamespace = "http://cxf.webservice.com", // 与接口中的命名空间一致,一般是接口的包名倒
endpointInterface = "com.webservice.cxf.UserWebService"// 接口地址
)
public class UserWebServiceImpl implements UserWebService {

@Autowired
SysUserMapper userMapper;

@Override
public String getUserById(Long id) {
return JSON.toJSONString(ResultUtil.successData(userMapper.selectById(id)));
}

@Override
public String updateUser(String user) {
JSONObject object = JSONObject.parseObject(user);
SysUser sysUser = object.toJavaObject(SysUser.class);
userMapper.updateById(sysUser);
return JSON.toJSONString(ResultUtil.successData(userMapper.selectById(sysUser.getId())));
}
}

③ CXF配置类

@Configuration
public class CxfConfig {

@Bean
public ServletRegistrationBean cxfServlet() {
return new ServletRegistrationBean(new CXFServlet(),"/userWebService/*");
}

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

@Bean
public UserWebServiceImpl userWebService() {
return new UserWebServiceImpl();
}

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

这样服务端就搭建好了。启动工程,访问http://localhost:8086/userWebService/api?wsdl,即可看到如下图示:
SpringBoot整合CXF实现WebService_java

【2】动态客户端实例测试

这里不生成客户端代码而是使用​​JaxWsDynamicClientFactory.newInstance()​​来进行测试。

@Test
public void getUserById(){
//创建动态客户端
JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
Client client = factory.createClient("http://localhost:8086/userWebService/api?wsdl");
// 需要密码的情况需要加上用户名和密码
//client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,PASS_WORD));
HTTPConduit conduit = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(2000); //连接超时
httpClientPolicy.setAllowChunking(false); //取消块编码
httpClientPolicy.setReceiveTimeout(120000); //响应超时
conduit.setClient(httpClientPolicy);
//client.getOutInterceptors().addAll(interceptors);//设置拦截器
try{
Object[] objects = new Object[0];
// invoke("方法名",参数1,参数2,参数3....);
objects = client.invoke("getUserById", 1L);
logger.info("-------------------------------------------------------");
logger.info("返回数据:" + objects[0]);
}catch (Exception e){
e.printStackTrace();
}
}

如果需要用户名、密码校验可以添加ClientLoginInterceptor拦截器。

【3】生成客户端代码

在idea中进入File > New Project…菜单打开新建项目窗口,依次选择Java、WebServices Client,Version项选择Apache Axis,Libraries项选择 Download。然后点击Next按钮进入下一页。
SpringBoot整合CXF实现WebService_SpringBoot_02

生成代码然后在新窗口打开工程,会出现如下图:
SpringBoot整合CXF实现WebService_SpringBoot_03

如果没有弹出上面窗口,则手动创建。工程名右键选择WebServices > Generate Java Code From Wsdl ,生成客户端代码。
SpringBoot整合CXF实现WebService_json_04

生成的代码如下,此时是不可用的:
SpringBoot整合CXF实现WebService_SpringBoot_05
修改代码如下:

public class HelloWorldClient {
public static void main(String[] argv) {
try {
UserWebService_ServiceLocator locator = new UserWebService_ServiceLocator();
UserWebService_PortType userWebServiceImplPort = locator.getUserWebServiceImplPort();
String userById = userWebServiceImplPort.getUserById(1L);
System.out.println(userById);
} catch (javax.xml.rpc.ServiceException ex) {
ex.printStackTrace();
} catch (java.rmi.RemoteException ex) {
ex.printStackTrace();
}
}
}

测试结果如下图:
SpringBoot整合CXF实现WebService_SpringBoot_06