webservice编程基础—cxf

阅读更多
最近研究了一下cxf的使用,主要的步骤如下:
一, 下载最新的cxf包apache-cxf-2.6.2.tar.zip,并解压,有一个lib文件,里面的jar包,就是webservice需要的(不完全需要,看你的应用,但是懒的分),加载进你的webservice的工程即可。
二, 配置两个配置文件,为beans.xml和web.xml,内容如下:
beans.xml



     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">

    

    

    

    

需要注意的是,上面红色的部分,其中,id不用管,主要是和spring集成需要的吧,address就是你的服务名,这里配置为HelloWorld。Implementor配置的是服务的实现类,这里是com.demo包里的类HelloWorldImpl。

Web.xml
  
 
       
        contextConfigLocation  
        WEB-INF/beans.xml  
   
  
      
          
            org.springframework.web.context.ContextLoaderListener  
       
  
   
  
       
         CXFServlet  
           
              org.apache.cxf.transport.servlet.CXFServlet  
        
  
    
  
       
         CXFServlet  
         /services/*  
    
  

   上面红色部分是在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 SayHiToUserList(@WebParam(targetNamespace="http://demo.com/")List 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 users = new LinkedHashMap();

                    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 SayHiToUserList(List userList) {
                     String[] result = new String[userList.size()];
                     ArrayList list = new ArrayList();
                     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。如下:
原因是服务器端的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类型时,可能会出现问题,不知道什么原因,麻烦哪位大哥知道,告诉我,我们一起学习吧。

你可能感兴趣的:(cxf,webservice,cxf,webservice)