Cxf + Spring3.0 入门开发WebService51CTO博客 - 凯时娱乐

Cxf + Spring3.0 入门开发WebService51CTO博客

2019年04月01日12时56分01秒 | 作者: 觅波 | 标签: 开发,效劳,装备 | 浏览: 2345

        由于公司事务需求, 需求运用WebService技能对外供给效劳,曾经没有做过相似的项目,在网上搜索了许多材料,终究决议运用Cxf + Spring的结构,原因很简单,便是由于Cxf功能强大而且能够和Spring无缝集成。

        Apache CXF 是一个开放源代码结构,供给了用于便利地构建和开发 Web 效劳的牢靠根底架构。它答应创立高性能和可扩展的效劳,您能够将这样的效劳布置在 Tomcat 和依据 Spring 的轻量级容器中,以及布置在更高档的效劳器上,例如 Jboss、IBM® WebSphere® 或 BEA WebLogic。

        首要阐明一下项目中运用的jar包如下图,效劳器端项目项目称号 CxfSpringServer, 客户端项目称号为 CxfSpringClient 两个项目运用的都是以下的jar包, 程序中没有运用最新的cxf-2.4.1版别由于, 该版别不知道是否有问题, 发动的时分总是报错。Spring运用的是3.0。

榜首部分开发效劳器端: 

 1: 开发接口程序,接口中界说了serviceName的称号,以及命名空间,留意这个命名空间便是将来客户端中生成的接口的package的途径。

         别的@WebResult(name="out") 这句话界说了wadl文件中输出数据的姓名,cxf中默许的输出称号是

return,其时要改这个姓名也花了不少时刻。需求改动这个称号的朋友请留意这个细节。

  1. package com.cxf.bo; 
  2. import javax.jws.WebParam; 
  3. import javax.jws.WebResult; 
  4. import javax.jws.WebService; 
  5. @WebService(serviceName="IWsTestBO",targetNamespace="http://impl.ws.com") 
  6. public interface IWsTestBO { 
  7.     @WebResult(name="out") 
  8.     public String execute(@WebParam(name = "arg0",targetNamespace="http://impl.ws.com")String arg0); 

   2:  接下来开发IWsTestBO 接口的完结类。

 @Service("wsServiceBO")  选用的是spring3.0的注解开发。

  1. package com.cxf.bo.impl; 
  2. import javax.jws.WebService; 
  3. import org.springframework.stereotype.Service; 
  4. import com.cxf.bo.IWsTestBO; 
  5. @Service("wsServiceBO") 
  6. @WebService(targetNamespace="http://impl.ws.com") 
  7. public class WsTestBOImpl implements IWsTestBO{ 
  8.     public String execute(String arg0) { 
  9.         return "欢迎 " + arg0 + ",调用WebService效劳...."; 
  10.     } 

3: Spring的装备文件 bo-context.xml。装备文件中界说了WebService的相关特点,留意装备文件中的命名空间的界说是必不可少的。jaxws:endpointbiaoq标签界说了供给Web效劳的 Bean 拜访地址。 而且装备了效劳器承受数据的日志装备,当效劳器承受到拜访数据时jaxws:features标签装备能够将最原始的日志打印到操控台上。

  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:xsd="http://www.w3.org/2001/XMLSchema" 
  5. xmlns:context="http://www.springframework.org/schema/context" 
  6. xmlns:jaxws="http://cxf.apache.org/jaxws" 
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans 
  8.                     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
  9.                     http://www.springframework.org/schema/context 
  10.                     http://www.springframework.org/schema/context/spring-context-3.0.xsd 
  11.                     http://cxf.apache.org/jaxws  
  12.                     http://cxf.apache.org/schemas/jaxws.xsd">  
  13.  
  14.     <context:component-scan base-package="com.cxf.bo"/> 
  15.      
  16.     <import resource="classpath:META-INF/cxf/cxf.xml"/> 
  17.     <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/> 
  18.     <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> 
  19.  
  20.     <jaxws:endpoint id="wsServiceBean" implementor="#wsServiceBO" address="/execute" publish="true" > 
  21.         <jaxws:features>  
  22.             <bean class="org.apache.cxf.feature.LoggingFeature" />  
  23.         </jaxws:features>  
  24.     </jaxws:endpoint>  
  25. </beans> 

 4:接下来是web.xml文件的装备:

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <web-app version="2.5"  
  3.     xmlns="http://java.sun.com/xml/ns/javaee"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
  7.     <context-param> 
  8.         <param-name>contextConfigLocation</param-name> 
  9.         <param-value>/WEB-INF/bo-context.xml</param-value> 
  10.      </context-param> 
  11.      <listener> 
  12.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
  13.      </listener> 
  14.       <servlet>  
  15.           <servlet-name>CXFServlet</servlet-name>  
  16.           <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  
  17.           <load-on-startup>0</load-on-startup>  
  18.       </servlet>  
  19.       <servlet-mapping> 
  20.         <servlet-name>CXFServlet</servlet-name> 
  21.         <url-pattern>/services/*</url-pattern> 
  22.       </servlet-mapping> 
  23. </web-app> 

5: 到现在为止效劳器端的程序现已开发完结,是不是很简单。现在能够布置到Tomcat6.0效劳器。在布置效劳器的时分还有一个需求留意的问题。布置tomcat没有问题,可是布置到resin效劳器的时分就会报反常: property "javax.xml.stream.supportDTD" not supported 。上网查询了一些材料,发现的确是resin效劳器有问题, 改善计划是, 首要在resin.conf装备中找到如下代码:

  1. <! Uncomment to use Resins XML implementations 
  2.  - <system-property javax.xml.parsers.DocumentBuilderFactory 
  3.      -                 ="com.caucho.xml.parsers.XmlDocumentBuilderFactory"/> 
  4.  - <system-property javax.xml.parsers.SAXParserFactory 
  5.      -                 ="com.caucho.xml.parsers.XmlSAXParserFactory"/> 

     假如现已运用,就替换下面,假如没有运用,就加上下面的装备 

  1. <system-property javax.xml.stream.XMLInputFactory="com.sun.xml.internal.stream.XMLInputFactoryImpl" />  

     布置之后拜访如下地址  http://localhost:9113/CxfSpringServer/services/execute?wsdl  我电脑用的是9113的端口,你的必定和我的是不一样的,所以你拜访的时分改一下端口就能够了。地址拜访成功时分会呈现一个xml的装备文件的信息,这儿就不展现了。

第二部分开发客户端:

1: 客户端和效劳器端是两个独立的使用,jar包用的是同一组。假如你用myeclipse的话能够经过myeclipse自带的webservice客户端生成导游生成客户端接口。依据地址生成客户端这样比较便利,可是生成的文件中除了接口类之外,其它都没什么用的,能够删掉。

 2: 客户端接口类如下

  1. package com.ws.impl; 
  2. import javax.jws.WebMethod; 
  3. import javax.jws.WebParam; 
  4. import javax.jws.WebResult; 
  5. import javax.jws.WebService; 
  6. import javax.xml.ws.RequestWrapper; 
  7. import javax.xml.ws.ResponseWrapper; 
  8. @WebService(name = "IWsTestBO", targetNamespace = "http://impl.ws.com") 
  9. public interface IWsTestBO { 
  10.     @WebMethod 
  11.     @WebResult(name = "out", targetNamespace = "") 
  12.     @RequestWrapper(localName = "execute", targetNamespace = "http://impl.ws.com", className = "com.ws.impl.Execute") 
  13.     @ResponseWrapper(localName = "executeResponse", targetNamespace = "http://impl.ws.com", className = "com.ws.impl.ExecuteResponse") 
  14.     public String execute(@WebParam(name = "arg0", targetNamespace = "http://impl.ws.com") String arg0); 

3: 客户端的Spring装备文件如下: 

  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:xsd="http://www.w3.org/2001/XMLSchema" 
  5. xmlns:context="http://www.springframework.org/schema/context" 
  6. xmlns:jaxws="http://cxf.apache.org/jaxws" 
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans 
  8.                     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
  9.                     http://www.springframework.org/schema/context 
  10.                     http://www.springframework.org/schema/context/spring-context-3.0.xsd 
  11.                     http://cxf.apache.org/jaxws  
  12.                     http://cxf.apache.org/schemas/jaxws.xsd">  
  13.      
  14.     <import resource="classpath:META-INF/cxf/cxf.xml"/> 
  15.     <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/> 
  16.     <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> 
  17.      
  18.     <bean id="wsClient" class="com.ws.impl.IWsTestBO" factory-bean="clientFactory" factory-method="create"/> 
  19.     <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> 
  20.         <property name="serviceClass" value="com.ws.impl.IWsTestBO"/> 
  21.         <property name="address" value="http://localhost:9113/CxfSpringServer/services/execute?wsdl"/> 
  22.     </bean> 
  23. </beans> 

 4:  客户端主函数测验类如下: 

  1. package com.test; 
  2. import org.springframework.context.ApplicationContext; 
  3. import org.springframework.context.support.ClassPathXmlApplicationContext; 
  4. import com.ws.impl.IWsTestBO; 
  5.  
  6. public class WsTestClient { 
  7.     public static void main(String[] args) { 
  8.         ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"bo-context.xml"}); 
  9.         IWsTestBO client = (IWsTestBO)ctx.getBean("wsClient"); 
  10.         String result = client.execute("张健"); 
  11.         System.out.println(result); 
  12.     } 

5:效劳器端输入输出日志如下: 

  1. 信息: Inbound Message 
  2.  
  3. ID: 1 
  4. Address: /CxfSpringServer/services/execute 
  5. Encoding: UTF-8 
  6. Content-Type: text/xml; charset=UTF-8 
  7. Headers: {cache-control=[no-cache], content-type=[text/xml; charset=UTF-8], connection=[keep-alive], host=[localhost:9113], Content-Length=[213], SOAPAction=[""], user-agent=[Apache CXF 2.2.12], Content-Type=[text/xml; charset=UTF-8], Accept=[*/*], pragma=[no-cache]} 
  8. Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:execute xmlns:ns1="http://impl.ws.com"><arg0 xmlns="http://impl.ws.com">张健</arg0></ns1:execute></soap:Body></soap:Envelope> 
  9.  
  10. 2011-7-29 12:59:07 org.apache.cxf.interceptor.LoggingOutInterceptor$LoggingCallback onClose 
  11. 信息: Outbound Message 
  12. ID: 1 
  13. Encoding: UTF-8 
  14. Content-Type: text/xml 
  15. Headers: {} 
  16. Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:executeResponse xmlns:ns1="http://impl.ws.com"><out>欢迎 张健,调用WebService效劳....</out></ns1:executeResponse></soap:Body></soap:Envelope> 
  17.  

     关于Cxf  + Spring3.0 集成开发WebService效劳的入门比如程序就写到这儿,有问题的童鞋能够留言。咱们一同评论, 谢谢!

附件:http://down.51cto.com/data/2358629
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯时娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章