最近研究了一下cxf的使用,主要的步骤如下:
 
一,	下载最新的cxf包apache-cxf-2.6.2.tar.zip,并解压,有一个lib文件,里面的jar包,就是webservice需要的(不完全需要,看你的应用,但是懒的分),加载进你的webservice的工程即可。
 
二,	配置两个配置文件,为beans.xml和web.xml,内容如下:
 
beans.xml
 
<?xml version="1.0" encoding="UTF-8"?> 
 
 
<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.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-extension-soap.xml" /> 
 
 
     <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> 
 
 
     <jaxws:endpoint id="HelloWorld" address="/HelloWorld" implementor="com.demo.HelloWorldImpl"/>
 
</beans>
 
需要注意的是,上面红色的部分,其中,id不用管,主要是和spring集成需要的吧,address就是你的服务名,这里配置为HelloWorld。Implementor配置的是服务的实现类,这里是com.demo包里的类HelloWorldImpl。
 
 
Web.xml
 
<?xml version="1.0" encoding="UTF-8"?>   
 
<web-app xmlns:j2ee="http://java.sun.com/xml/ns/j2ee">  
 
     <context-param>   
 
        <param-name>contextConfigLocation</param-name>   
 
        <param-value>WEB-INF/beans.xml</param-value>   
 
    </context-param>   
 
    <listener>   
 
        <listener-class>   
 
            org.springframework.web.context.ContextLoaderListener   
 
        </listener-class>   
 
    </listener>   
 
     <servlet>   
 
         <servlet-name>CXFServlet</servlet-name>   
 
         <servlet-class>   
 
              org.apache.cxf.transport.servlet.CXFServlet   
 
         </servlet-class>   
 
     </servlet>   
 
     <servlet-mapping>   
 
         <servlet-name>CXFServlet</servlet-name>   
 
         <url-pattern>/services/*</url-pattern>   
 
     </servlet-mapping>   
 
</web-app>
 
   上面红色部分是在weblogic配置需要主要的(在上一篇文章中提过)。
 
下面是服务端的代码:
 
	HelloWorld.java:
 
package com.demo;
 
import java.util.ArrayList;
 
import java.util.List;
 
import javax.jws.WebParam;
 
import javax.jws.WebService;
 
          @WebService
 
          public interface HelloWorld {
 
        	  //@WebParam(name="text",targetNamespace="http://demo.com/")
 
               String sayHi(@WebParam(targetNamespace="http://demo.com/")String text);
 
               String sayHiToUser(@WebParam(targetNamespace="http://demo.com/")User user);
 
               ArrayList<String> SayHiToUserList(@WebParam(targetNamespace="http://demo.com/")List<User> userList);
 
           }
 
HelloWorldImpl.java
 
  package com.demo;
  
 
import java.util.ArrayList;
 
import java.util.LinkedHashMap;
 
import java.util.List;
 
import java.util.Map;
          
 
         //注解
 
        //@WebService(endpointInterface="com.demo.HelloWorld",serviceName="HelloWorld")
 
         public class HelloWorldImpl implements HelloWorld {
   
 
           Map<Integer, User> users = new LinkedHashMap<Integer, User>();
 
 
                    public String sayHi(String text) {
 
                                return "Hello " + text;
 
                   }
 
                    public String sayHiToUser(User user) {
 
                             users.put(users.size()+1, user);
 
                             return "Hello "+ user.getName();
 
                   }
 
           public ArrayList<String> SayHiToUserList(List<User> userList) {
 
                     String[] result = new String[userList.size()];
 
                     ArrayList<String> list = new ArrayList<String>();
 
                     int i=0;
 
                     for(User u:userList)
 
{
 
                                  result[i] = "Hello " + u.getName();
 
                                  list.add(result[i]);
 
                                  i++;
 
                      }
 
                      return list;
 
                   }
 
       }
 
 
注意在HellWorld.java中@WebService是表明如下的接口是webservice接口,不能删除。如果不加@WebParam(targetNamespace)以指定参数的命名空间,用xfire根据wsdl生成客户端时,会出现错误。原因为:
 
查看soap信息,发现在soap信息中多加入了namespace:ns2。如下:<ns2:operation xmlns:ns4="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="url2" xsi:type="ns4:url4">
 
 原因是服务器端的operation是没有定义targetNamespace,而xfire生成客户端时,如果也没有定义targetNamespace,它会默认的取Service的targetNamespace。
 
 
部署在Weblogic时,可能会出现jar包冲突:
 
解决办法是:
 
在startWebLogic.cmd。配置:
 
set CLASSPATH_CXF=E:\JavaWorkSpace\CXFServer2\WebRoot\WEB-INF\lib\geronimo-ws-metadata_2.0_spec-1.1.3.jar
 
set  CLASSPATH=%CLASSPATH_CXF%;%CLASSPATH%;%MEDREC_WEBLOGIC_CLASSPATH%
 
大概就是这些了,很容易吧。
 
 
PS:使用xfire调用cxf的服务时,如果传递List类型时,可能会出现问题,不知道什么原因,麻烦哪位大哥知道,告诉我,我们一起学习吧。
 
          
            
          
             
已有   0 人发表留言,猛击->>  这里<<-参与讨论
          
             
ITeye推荐