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,即可看到如下图示:
【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按钮进入下一页。
生成代码然后在新窗口打开工程,会出现如下图:
如果没有弹出上面窗口,则手动创建。工程名右键选择WebServices > Generate Java Code From Wsdl ,生成客户端代码。
生成的代码如下,此时是不可用的:
修改代码如下:
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();
}
}
}
测试结果如下图: