`
fenger_chui
  • 浏览: 103056 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

webservice编程基础—cxf

阅读更多
最近研究了一下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类型时,可能会出现问题,不知道什么原因,麻烦哪位大哥知道,告诉我,我们一起学习吧。
3
2
分享到:
评论
3 楼 fenger_chui 2012-09-21  
zhenglongfei 写道
本人用cxf以后觉的很简单,但是返回list类型不建议用,可全部返回string类型的xml字符串,调用者只需要解析字符串即可,不会出现任何错误。。

我是参数如果是List的时候会出现问题,而不是返回值是list出现问题。麻烦请教这是什么原因呢?
2 楼 freezingsky 2012-09-20  
虽然没用CXF,但是如果返回List的时候,出问题的话,可以考虑把List JSON化,这样肯定没问题了吧!
1 楼 zhenglongfei 2012-09-20  
本人用cxf以后觉的很简单,但是返回list类型不建议用,可全部返回string类型的xml字符串,调用者只需要解析字符串即可,不会出现任何错误。。

相关推荐

Global site tag (gtag.js) - Google Analytics