天天看点

SpringBoot整合CXF实现WebService

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

【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整合CXF实现WebService
如果没有弹出上面窗口,则手动创建。工程名右键选择WebServices > Generate Java Code From Wsdl ,生成客户端代码。
SpringBoot整合CXF实现WebService
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();
      }  
  }
}