Apache cxf JaxWs基本应用

来源:互联网 发布:蘑菇云刷机软件 编辑:程序博客网 时间:2024/06/05 08:15

Apache cxf JaxWs基本应用

标签: cxf
 7677人阅读 评论(2) 收藏 举报

本文以CXF 2.6.x为例,会用到jsr311.jar 。当前CXF最新版本为3.x,依赖jsr版本也有所不同,且spring配置文件中也不再需要配置:<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />。

在做版本升级时,需要留以上细节。


现在开始以CXF2.6.x做一些Demo。

一、首先我们搭建一个Maven Project,其中pom.xml完整内容如下:

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  3.     <modelVersion>4.0.0</modelVersion>  
  4.     <artifactId>abc-api</artifactId>  
  5.     <packaging>war</packaging>  
  6.     <version>${global.version}</version>  
  7.       
  8.     <parent>  
  9.         <groupId>com.abc.module</groupId>  
  10.         <artifactId>abc-parent</artifactId>  
  11.         <version>0.0.1-SNAPSHOT</version>  
  12.     </parent>  
  13.       
  14.     <dependencies>  
  15.         <dependency>  
  16.             <groupId>javax.ws.rs</groupId>  
  17.             <artifactId>jsr311-api</artifactId>  
  18.             <version>1.1.1</version>  
  19.         </dependency>  
  20.         <dependency>  
  21.             <groupId>org.apache.cxf</groupId>  
  22.             <artifactId>cxf-rt-transports-http</artifactId>  
  23.             <version>2.6.1</version>  
  24.         </dependency>  
  25.         <dependency>  
  26.             <groupId>org.apache.cxf</groupId>  
  27.             <artifactId>cxf-rt-frontend-jaxws</artifactId>  
  28.             <version>2.6.1</version>  
  29.         </dependency>  
  30.         <dependency>  
  31.             <groupId>org.apache.cxf</groupId>  
  32.             <artifactId>cxf-rt-frontend-jaxrs</artifactId>  
  33.             <version>2.6.1</version>  
  34.         </dependency>  
  35.         <dependency>  
  36.             <groupId>org.codehaus.jettison</groupId>  
  37.             <artifactId>jettison</artifactId>  
  38.             <version>1.3.5</version>  
  39.         </dependency>  
  40.         <dependency>  
  41.             <groupId>axis</groupId>  
  42.             <artifactId>axis</artifactId>  
  43.             <version>1.4</version>  
  44.         </dependency>  
  45.         <dependency>  
  46.             <groupId>org.codehaus.woodstox</groupId>  
  47.             <artifactId>stax2-api</artifactId>  
  48.             <version>3.1.1</version>  
  49.         </dependency>  
  50.         <dependency>  
  51.             <groupId>org.jbarcode</groupId>  
  52.             <artifactId>jbarcode</artifactId>  
  53.             <version>0.2.8</version>  
  54.         </dependency>  
  55.     </dependencies>  
  56.   
  57.     <build>  
  58.         <finalName>${project.artifactId}</finalName>  
  59.     </build>  
  60. </project>  


二、配置web.xml

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xmlns="http://java.sun.com/xml/ns/javaee"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  5.     id="WebApp_ID" version="2.5">  
  6.     <display-name>fsp-api</display-name>  
  7.     <context-param>  
  8.         <param-name>contextConfigLocation</param-name>  
  9.         <param-value>classpath*:application.xml</param-value>  
  10.     </context-param>  
  11.   
  12.     <!-- spring context listener -->  
  13.     <listener>  
  14.         <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>  
  15.     </listener>  
  16.     <listener>  
  17.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  18.     </listener>  
  19.   
  20.     <!-- CXF -->  
  21.     <servlet>  
  22.         <servlet-name>cxf</servlet-name>  
  23.         <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  
  24.         <load-on-startup>1</load-on-startup>  
  25.     </servlet>  
  26.     <servlet-mapping>  
  27.         <servlet-name>cxf</servlet-name>  
  28.         <url-pattern>/services/*</url-pattern>  
  29.     </servlet-mapping>  
  30.       
  31. </web-app>  

三、创建Webservice对外业务接口

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. import javax.jws.WebMethod;  
  2. import javax.jws.WebParam;  
  3. import javax.jws.WebService;  
  4.   
  5. @WebService  
  6. public interface ILogisticsWsApi {  
  7.   
  8.     /** 
  9.      * @param xmlParam 
  10.      * @return xml string 
  11.      */  
  12.     @WebMethod(operationName = "itemConfirm")  
  13.     public String itemConfirm(@WebParam String xmlParam);  
  14. }  

四、实现Webservice接口

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public class LogisticsWsApiImpl implements ILogisticsWsApi {  
  2.   
  3.     private Logger log = LoggerFactory.getLogger(getClass());  
  4.       
  5.     @Override  
  6.     public String itemConfirm(String xmlParam) {  
  7.         // TODO Auto-generated method stub  
  8.         log.debug("itemConfirm xml param : " + xmlParam);  
  9.   
  10.         LogisticsMessage logisticsMessage = LogisticsFactory.createItemConfirmRequest();  
  11.         logisticsMessage.decode(xmlParam);  
  12.           
  13.         // to do something ...  
  14.           
  15.         return response;  
  16.     }  
  17.   
  18. }  

五、配置Spring xml,让Webservice提供服务

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.     xmlns:jaxws="http://cxf.apache.org/jaxws"  
  5.     xmlns:jaxrs="http://cxf.apache.org/jaxrs"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  7.                        http://www.springframework.org/schema/beans/spring-beans.xsd  
  8.                        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd  
  9.                     http://cxf.apache.org/jaxrs  
  10.                     http://cxf.apache.org/schemas/jaxrs.xsd">  
  11.   
  12.     <import resource="classpath:META-INF/cxf/cxf.xml" />  
  13.     <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />  
  14.     <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />  
  15.   
  16.     <bean id="loggingInInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor"/>  
  17.     <bean id="loggingOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>  
  18.   
  19.     <jaxws:endpoint id="logisticsWsApiServiceContainer" implementor="com.abc.api.service.LogisticsWsApiImpl" address="/logisticsWsApi" >  
  20.             <jaxws:inInterceptors>  
  21.                 <ref bean="loggingInInterceptor"/>  
  22.             </jaxws:inInterceptors>  
  23.             <jaxws:outInterceptors>  
  24.                 <ref bean="loggingOutInterceptor"/>  
  25.             </jaxws:outInterceptors>  
  26.     </jaxws:endpoint>  
  27.   
  28. </beans>  

至此,Webservice服务端的代码就完成了,启动Web server即可以对外提供服务了。

假设你当前的Maven Project名字为:abc-api,那么实际访问Webservice 的Address就为:http://ip:port/abc-api/services/logisticsWsApi?wsdl


六、我们编写一个JunitTester测试前面的Webservice接口

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. import static org.junit.Assert.*;  
  2.   
  3. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;  
  4. import org.junit.After;  
  5. import org.junit.Before;  
  6. import org.junit.Test;  
  7. import com.abc.warehouse.service.ILogisticsWsApi;  
  8.   
  9. public class LogisticsWsApiTester {  
  10.   
  11.     private JaxWsProxyFactoryBean wsFactory;  
  12.     private String address = "http://localhost:8080/abc-api/services/logisticsWsApi";  
  13.       
  14.     /** 
  15.      *  
  16.      * @throws java.lang.Exception 
  17.      */  
  18.     @Before  
  19.     public void setUp() throws Exception {  
  20.           
  21.         wsFactory = new JaxWsProxyFactoryBean();  
  22.         wsFactory.setAddress(address);  
  23.         wsFactory.setServiceClass(ILogisticsWsApi.class);  
  24.     }  
  25.   
  26.     /** 
  27.      *  
  28.      * @throws java.lang.Exception 
  29.      */  
  30.     @After  
  31.     public void tearDown() throws Exception {  
  32.         wsFactory = null;  
  33.     }  
  34.   
  35.     /** 
  36.      * Test method for {@link com.abc.api.service.LogisticsWsApiImpl#itemConfirm(java.lang.String)}. 
  37.      */  
  38.     @Test  
  39.     public void testItemConfirm() {  
  40. //        fail("Not yet implemented");  
  41.         String xmlParam = "Hello JaxWs , 欢迎";  
  42.         ILogisticsWsApi logisticsWsApi = (ILogisticsWsApi) wsFactory.create();  
  43.         String recvMessage = logisticsWsApi.itemConfirm(xmlParam);  
  44.         assertEquals(recvMessage, null);  
  45.     }  

当然,我们也可以把JaxWsProxyFactoryBean用Spring类配置或直接在Spring中配置jaxws:client

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.     xmlns:jaxws="http://cxf.apache.org/jaxws"  
  5.     xmlns:jaxrs="http://cxf.apache.org/jaxrs"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  7.                        http://www.springframework.org/schema/beans/spring-beans.xsd  
  8.                        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd  
  9.                     http://cxf.apache.org/jaxrs  
  10.                     http://cxf.apache.org/schemas/jaxrs.xsd">  
  11.   
  12.     <import resource="classpath:META-INF/cxf/cxf.xml" />  
  13.     <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />  
  14.     <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />  
  15.   
  16.     <jaxws:client id="logisticsWsApi" serviceClass="com.abc.warehouse.service.ILogisticsWsApi" address="${logisticsWsApiAddress}"/>  
  17. </beans>  

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <bean id="logisticsWsApi" class="com.abc.warehouse.service.ILogisticsWsApi" factory-bean="clientFactory" factory-method="create" />  
  2. <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">  
  3.         <property name="serviceClass" value="com.abc.warehouse.service.ILogisticsWsApi" />  
  4.         <property name="address" value="${logisticsWsApiAddress}" /> <!--  http://localhost:8080/abc-api/services/logisticsWsApi  -->  
  5.     </bean>  


到这里,我们就已经完成了Webservice服务端和客户端的开发。

其中,在日志拦截器LoggingInInterceptor类的logging(Logger logger, Message message)函数中,在输出日志时可能会遇到乱码问题,这个乱码不会影响实际的业务操作。

如果要修正这里的乱码,可以通过重载该函数来处理解码中文的问题。修改方法很简单,详情见:《Apache cxf JaxRs基本应用》。


0 0
原创粉丝点击