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; } }
【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(); } } }
测试结果如下图: