在学习java的过程中,会涉及到系统间的通信,两个系统之间的交互通信,也可以认为是一个系统发布服务,另外一个系统调用服务,其中我采用的是http协议进行通信,数据的序列化和反序列化都由CXF来完成,调用的服务返回什么就接收什么,作为程序员只需要关注自己的业务逻辑即可。下面将会说一下如何使用CXF及实现的过程中的一些配置。
第一:导包
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.10</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.10</version>
</dependency>
将这两个包纳入进classpath下就可以了。这样就完成了第一步的操作(至于还要依赖spring的包,我不怎么了解)
第二:在服务端发布服务,这个过程是比较细的,不像是客户端调用那么简单,发布出去的服务为一个接口。分别说一下
1.在web.xml中配置如下信息:
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/p/*</url-pattern>
</servlet-mapping>
这就是CXF的servlet。这是在服务端中web.xml中配置的,客户端是不需要配置的。
2.配好web.xml后继续配置cxf.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation=" http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<jaxws:endpoint id="myService" implementor="com.my.send.service.impl.MyServiceImpl" address="/sendMail"/>
</beans>
解释一下蓝色字体的意思,其他的都是模板中,或者说是quickstart。endpoint id="myService";其中的id是可以随便起的,这个我现在么有用到。关键是后面的implementor一看便知是实现类。如下图所示:为src/main/java中的包。其中包含实现类和接口。
配置好spring-cxf.xml后将这个xml导入到spring-config.xml中,目的是随着spring的加载同时加载。
如上所示就配置好了cxf.xml的一些配置。
3.服务端接口的处理和实现类的处理
如上图所示的,一个是提供服务的接口,一个是接口的实现类。接口中要写上一个标签:
同样的在实现类中也有实现加入同样的标签:
加入的标签为上图所示.其中webservice中加了一个endpointInterface"";这其中的意思就是接口的终点。把包名和类名加入就可以。(包名+接口名)。这步完成,服务端的配置也就完了。这其中的一些业务逻辑根据个人需求写。
第三步:配置客户端的CXF。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<jaxws:client id="myService"
serviceClass="com.my.send.service.MyService"
address="http://192.168.0.101:8083/p/sendMail"/>
</beans>
解释一些图中蓝色的字体所表示的意思:客户端也需要同样的包名和接口名,address中的内容为服务端的地址,通过http通信,其中/p/sendMail是请求服务端中web.xml中的CXFservlet。sendMail是自定义的,在服务端的cxf中可以看到。下图为客户端的包名和接口名。要严格与服务端的接口和包名保持一致,包括里面的接口方法。
配置好后需要在客户端中的接口处加上webservcie标签:如下图所示
完成上面的所有步骤就完成了一个完整的CXF的简单配置。其中服务端的POM.xml中的配置如下图所示,箭头所指的地方不写内容,当然也可以不加这个标签。
。下面就是启动两个系统了。经过一些配置,在服务端的方法,被客户端调用的时候就像是调用自己的方法一样,有返回值为String的话直接接受即可。下图为测试的结果
致此整个CXF的简单应用就完成了。
额外补充
如果服务端返回的是一ArrayList集合的话,并且集合中放的是一个类:如User这个类包含很多的属性。将对象的属性赋值后,最后将对象放入集合中返回给客户端。这个返回的过程中,当客户端是需要接受的时候。这个接受过程中也是有讲究的,如下图在服务端中建立一个user的domain类
在客户端调用的时候返回的是一个集合,集合中放的是一个user或多个user,那你在客户端也需要写相同的User类至于包名可以不同,其实就是一个实体类的映射关系。返回的集合中的泛型为User,这个是User中的属性和服务端的User中的属性是一致命的。否则会报错。。总之:User要把它看成是同一个类在不同包中就可以了。