`
afei115
  • 浏览: 17584 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论
  • kyvin: 还是有点不明白加不加 Aegis 有什么影响,同样服务可以发布 ...
    cxf应用
  • xixix2004: 哎..内容很好 只是这个排版格式..估计没人有兴趣看下去了
    cxf应用

cxf应用

    博客分类:
  • cxf
阅读更多

1,ClientProxyFactoryBean调用

对于ClientProxyFactoryBean调用,我查找了很多资料,一般采用的方式是:

 

     ClientProxyFactoryBean factory = new ClientProxyFactoryBean();
        factory.setServiceClass(com.qware.useradm.webservice.ShareQueryWebServiceIface.class);
        factory.setAddress("http://localhost:8080/mytest/webservice/ceshi");
        factory.getServiceFactory().setDataBinding(new AegisDatabinding());
       ShareQueryWebServiceIface client = (ShareQueryWebServiceIface) factory.create();
        System.out.println("Response: " );
     
     System.out.println("Response: " + client.powerlvldef(xml));

这个方法不能说不正确,但我一直以来都没能调试通过,估计是自己问题,别人也写了关于这个调试的内容,如下:

 

客户端没有在SPRING里试成功,但写代码也相当简单,Aegis真好:

        getBean ("notifyClient");
        
        ClientProxyFactoryBean factory 
= new ClientProxyFactoryBean();
        factory.setServiceClass(NotifyService.
class);
        factory.setAddress(
"http://127.0.0.1:8080/ebnms/NotifyService");
        factory.getServiceFactory().setDataBinding(
new AegisDatabinding());
        NotifyService client 
= (NotifyService) factory.create();
        DoTest (client);


这次,到是CXF的SERVER和CLIENT都可以正常通信了。但我不说也知道啦,PERL又出问题了!

 

第三步,
又进一步搜,才知道Document, Literal, RPC, Encoding对SOAP消息的影响,这篇文章(中文的)相当好!
大义是RPC/Encoding将方法名称放入了operation节中,并且消息里含有类型信息,不方便检验。
而Document/Literal通过增加WSDL复杂度,将方法名、参数类型全部放入了types一节,方便了处理。
而SOAP::Lite只支持RPC/Encoding的方式,但也有办法让它形成Doc/Lit的消息:点这里
但,这种方法只支持JAX-WS的服务,Aegis的PERL就会出错了。

所以,不管用哪种要么JAVA的CLIENT和SERVER通信有问题,不然就是把PERL拒之门外。我怀疑是不是CXF的JAX-WS的数组处理有问题,不然Aegis为何不出错?另外,Aegis对PERL的消息不够宽容,本已是Doc/Lit格式,只是带有TYPE信息也会出错。
不知如何解,先记在此,以后回过头来再研究了。

 

   我对上面所说持保留态度,我想应该是我们本身配置的问题,因为jax-ws和Aegis这两种方法本身就存在着区别,但上面的作者确采用相同的配置方式,我觉得肯定不对的,下面是我找到的一篇文章,我感觉这个操作才是正确,但我没进行验证,文章如下:

 

     采用Aegis数据绑定

如果采用simple frontend方式发布复杂的web service 有自定义数据,默认的情况是采用JAXB绑定,如果你不想用注释,那就用Aegis数据绑定。

Aegis是一个快速,基于STAX(Streaming API for XML)的数据绑定,它能使采用代码优先方式发布web service的情况更简单。Aegis 支持接口,集合类(包括Map)和各种数据类型。

1、    编写复杂的业务接口和实现类

public interface HelloWorld {

    String sayHello(String text);

    String sayUserHello(User user);

    List<User> findUsers();

    Map<Integer, User> getMapUsers();

}

其实的和普通的java区别,不用写xmlAdapter,也不用注释。

2、    发布web service

只要在发布web service时加上:svrFactory.getServiceFactory().setDataBinding(new AegisDatabinding());

具体如下:

    protected Server() throws Exception

    {

        HelloWorldImpl helloworldImpl = new HelloWorldImpl();

        ServerFactoryBean svrFactory = new ServerFactoryBean();

        //设置服务接口类

        svrFactory.setServiceClass(HelloWorld.class);

        svrFactory.setAddress("http://localhost:9000/Hello");

        //设置服务实现接口类

        svrFactory.setServiceBean(helloworldImpl);

        //采用Aegis方式进行数据绑定

        svrFactory.getServiceFactory().setDataBinding(new AegisDatabinding());

 

        //创建服务

        svrFactory.create();

}

 

3、    客户端

创建与具体webservice技术无关的业务接口,因为传递的是User接口,所以要在客户端加上

User 接口和UserImple类

public interface User {

    String getPassword();

    String getUsername();

    void setUsername(String username);

    void setPassword(String password);

    void setUserId(Integer userId);

    Integer getUserId();

}

public class UserImpl implements User {

    private Integer userId;

    private String username;

    private String password;

    public Integer getUserId() {

       return userId;

    }

    public void setUserId(Integer userId) {

       this.userId = userId;

    }

    public String getPassword() {

       return password;

    }

    public void setPassword(String password) {

       this.password = password;

    }

    public String getUsername() {

       return username;

    }

    public void setUsername(String username) {

       this.username = username;

    }

    public UserImpl(String username, String password) {

       super();

       this.username = username;

       this.password = password;

    }

    public UserImpl() {

    }

    public UserImpl(String username) {

       this.username = username;

    }

    public UserImpl(Integer userId, String username, String password) {

       this.userId = userId;

       this.username = username;

       this.password = password;

    }

  

}

4、    测试,调用web service.

其中最关键要加上:

factory.getServiceFactory().setDataBinding(new AegisDatabinding());

 

public class Client {

 

    public static void main(String args[]) throws Exception

    {

        ClientProxyFactoryBean factory = new ClientProxyFactoryBean(); 

        //设置已发布服务接口

        factory.setServiceClass(HelloWorld.class);

        //为客户端代理bean 设置已经发布的服务地址

        factory.setAddress("http://localhost:9000/Hello"); 

        //采用Aegis数据绑定

        factory.getServiceFactory().setDataBinding(new AegisDatabinding());

 

        //获取已发布服务接口实例

        HelloWorld client = (HelloWorld)factory.create();

        System.out.println(client.sayHello("Tom"));

        System.out.println(client.sayUserHello(new UserImpl("aaa1111111111","bbb")));

       

        List<User> list = client.findUsers();

       Iterator<User> i = list.iterator();

       while (i.hasNext()) {

           User u = i.next();

           System.out.println(u.getUsername());

       }

       System.out.println("--------------------");

       Map<Integer ,User> map = client.getMapUsers();

       for (Integer e : map.keySet()) {

//         System.out.println(e);

           System.out.println(map.get(e).getUsername());

 

       }

        System.exit(0);

    }

}

5、    与spring集成:

服务器的spring-cxf.xml的配置文件中加上:<simple:dataBinding>部分。

<beans xmlns="http://www.springframework.org/schema/beans"

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xmlns:simple="http://cxf.apache.org/simple"

      xmlns:soap="http://cxf.apache.org/bindings/soap"

      xsi:schemaLocation="

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd

http://cxf.apache.org/simple http://cxf.apache.org/schemas/simple.xsd">

 

  <simple:server id="helloservice" serviceClass="frontend.HelloWorld" address="/hello">

    <simple:serviceBean>

        <bean class="frontend.HelloWorldImpl" />

    </simple:serviceBean>

    <simple:dataBinding>

       <bean class="org.apache.cxf.aegis.databinding.AegisDatabinding" />

    </simple:dataBinding>

  </simple:server>

</beans>

客户端的配置文件修改spring-client.xml如下:

<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-2.0.xsd

http://cxf.apache.org/jaxws http://cxf.apache.org/schema/jaxws.xsd">

    <bean id="frontendClient" class="frontend.HelloWorld"

       factory-bean="frontendClientFactory" factory-method="create" />

    <bean id="aegisBean" class="org.apache.cxf.aegis.databinding.AegisDatabinding" scope="prototype"/>

    <bean id="frontendClientFactory" class="org.apache.cxf.frontend.ClientProxyFactoryBean">

       <property name ="dataBinding"  ref="aegisBean"/>

       <property name="serviceClass" value="frontend.HelloWorld" />

       <property name="address"

           value="http://localhost:9000/Hello" />

    </bean>

</beans>

 

二:JaxWsProxyFactoryBean调用

   String xml="";

  JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean(); 
         factoryBean.setServiceClass(com.qware.useradm.webservice.ShareQueryWebServiceIface.class); 
        factoryBean.setAddress("http://localhost:8080/mytest/webservice/ceshi"); 
        ShareQueryWebServiceIface client = (ShareQueryWebServiceIface) factoryBean.create(); 
        String response = client.powerlvldef(xml);

 

  我现在采用的就是这种方式,下面是我的xml配置文件:

 

  client文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:jaxws="http://cxf.apache.org/jaxws"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">

       <jaxws:client id="mytestWebServiceClient"
                  serviceClass="com.mytest.webservice.ceshi"
                  address="http://localhost:8080/mytest/webservice/ceshi" />
   </beans>

webservice文件:

    <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" />
 <!--
  这里是cxf的重点,就是通过这里将接口暴露出去的
  address="//HelloWorld"
  是接口暴露的地址,按照我的配置,地址应该是 http://localhost:8080/mytest/webservice/HelloWorld?wsdl
  这个地址就是将来我们提供给用户访问的接口地址。dbadm这是我的工程名字,webservice是我webservice的路径。
 -->
 <!-- <jaxws:server id="helloWorld"
  serviceClass="com.qware.mytest.webservice.impl.HelloWorldImpl"
  address="/HelloWorldWebService">
  <jaxws:serviceBean>
  <ref bean="comboServiceIface" /> 要暴露的 bean 的引用
  </jaxws:serviceBean>
  </jaxws:server>
 -->
 <!--If you want to reference a spring managed-bean, you can write like this:
  <bean id="hello" class="demo.spring.impl.HelloWorldImpl" />
  
  <jaxws:endpoint id="helloWorld" implementor="#hello" address="/HelloWorld" />-->

<bean id="mytestWebService"
  class="com.mytest.webservice.impl.ceshiWebServiceImpl">
   </bean> 
  <jaxws:endpoint id="mytestWebServiceEndpoint"
  implementor="#mytestWebService" address="/ceshi" />

</beans>

 

以上两种都是通过url进行调用,下面我主要说下采用类进行调用

 三:简单类调用

    ApplicationContext appContext = new ClassPathXmlApplicationContext(
  "file:WebRoot/WEB-INF/client.xml");
  
  HelloWorldIface client = (HelloWorldIface) appContext.getBean("helloClient");
  System.out.println(client.sayHi("jay"));

  对于xml的配置可以参照上面的xml配置方式。

四:注入调用

   我是将client.xml文件添加到applicationContext.xml文件中,在调用的action中配置属性mytestWebServiceClient,在下面就可以直接通过mytestWebServiceClient对事件进行调用了。

第三、四点我写的很简单,如果有疑问可以说下,我会回复,也许后面我会进行详细的修改,希望和大家共同学习,共同提高。

 

 

 

分享到:
评论
2 楼 kyvin 2010-05-14  
还是有点不明白加不加 Aegis 有什么影响,同样服务可以发布与调用
1 楼 xixix2004 2009-09-21  
哎..内容很好

只是这个排版格式..估计没人有兴趣看下去了

相关推荐

    Cxf应用全部jar包

    【标题】"Cxf应用全部jar包"涵盖了Apache CXF框架的核心组件以及与Spring框架的集成,这是一套全面的库集合,旨在帮助开发者在Java环境中构建和部署Web服务。Apache CXF是一个开源的Java框架,它允许开发人员创建、...

    Cxf应用整理学习资料

    ### CXF应用整理学习资料详解 #### 一、CXF简介与HelloWorld示例 Apache CXF是一个开源的框架,用于构建和消费基于SOAP、XML、REST等协议的Web服务。CXF支持JAX-WS和JAX-RS标准,为Java开发人员提供了丰富的API,...

    CXF应用整理(包括大文件上传MTOM、安全机制)

    【CXF 应用详解:从 HelloWorld 到高级特性】 CXF 是一款开源的 Java SOAP 和 RESTful 服务框架,它允许开发者轻松地创建和消费 Web 服务。本篇文章将深入探讨 CXF 的一些核心功能,包括简单的 HelloWorld 示例、...

    cxf+spring=webservice CXF 应用开发

    标题 "cxf+spring=webservice CXF 应用开发" 暗示了我们将讨论如何结合Apache CXF和Spring框架来创建Web服务。Apache CXF是一个开源的Java框架,主要用于构建和部署SOAP和RESTful Web服务。Spring框架则是一个广泛...

    cxf应用demo 以及与spring整合

    【描述】"CXF应用demo包含了四个工程:Client, Server, ClientSpring, ServerSpring。这些项目分别展示了CXF的基本使用和与Spring框架的整合。每个工程都包含了所有必要的jar包,因此可以直接运行,无需额外配置。" ...

    CXF support WAS Weblogic

    因此,在使用JBoss AS部署CXF应用时,可能会遇到来自CXF库及其依赖项的类加载问题。 **2. 解决方案** 为了防止类加载冲突,建议参考JBoss AS官方文档来启用类加载隔离功能。这样可以确保部署到JBoss AS上的CXF应用...

    apache-cxf-3.5.0.zip

    - **lib**: 存放CXF框架及其依赖库的JAR文件,这些库在运行CXF应用时是必不可少的。 - **etc**: 通常包含配置文件,如服务器配置、端点定义等,开发者可以自定义这些配置以满足项目需求。 3. **使用CXF开发Web...

    Cxf例子Cxf例子我自己写的

    本示例是个人编写的CXF应用实例,旨在帮助用户理解和运用CXF框架。 【描述】:“CXF例子和JAR包 100%能用我自己在公司起不来郁闷死了肯定是环境的问题,家里什么都没弄,jar包导进去就OK了,什么都没弄,起来就OK”...

    jdk21集成cxf示例程序

    6. **部署与运行**:将配置好的CXF应用打包成WAR文件,然后部署到支持Servlet 3.0以上的应用服务器,如Tomcat、Jetty等。启动服务器,Web服务就会在指定的URL上运行。 7. **测试Web服务**:可以使用CXF提供的CXF...

    CXF各种资料.rar

    "WebService之CXF开发指南.doc", "Cxf应用整理.doc", "CXF+WebService+-+release.docx", "基于spring+cxf实现用户文件传输的webservice.docx"是关于CXF的详细学习文档,涵盖了从基础概念到高级特性的讲解,以及具体...

    CXF 文件记录报文日志,非控制台打印。

    在CXF应用启动时,它会自动检测并使用这个配置来记录日志。如果需要调整日志级别或输出格式,只需修改配置文件即可。 在源代码中,你可能还会看到CXF的日志调用,如`org.apache.cxf.common.logging.LogFactory....

    apache-cxf-2.7.6.rar

    - **文档**:可能有用户指南、开发者手册、API文档等,帮助用户了解如何使用和开发CXF应用。 - **示例**:通常会提供一些示例项目,演示如何创建和部署Web服务,以及如何调用这些服务。 - **配置文件**:例如CXF的...

    apache-cxf-3.1.9.zip

    - `bin`:包含运行和构建CXF应用所需的脚本。 - `lib`:包含CXF的库文件,这些JAR文件是CXF运行时和开发时的依赖。 - `samples`:提供了一些示例项目,帮助你理解如何使用CXF开发Web服务。 - `docs`:包含CXF的用户...

    apache-cxf-2.7.18最小依赖包

    这个"apache-cxf-2.7.18最小依赖包"是该框架的一个精简版本,包含了运行CXF应用程序所必需的核心组件,旨在减少项目的体积,提高部署效率,同时确保基本功能的完整。 CXF,全称CXF CXF,最初由两个项目——XFire和...

    apache-cxf-2.7.5所有jar都在

    这个"apache-cxf-2.7.5"压缩包包含的是CXF的特定版本2.7.5的所有相关JAR文件,这些文件是运行和开发CXF应用程序所必需的。 CXF的核心功能包括: 1. **SOAP与RESTful服务支持**:CXF允许开发者创建和消费SOAP 1.1/...

    WebService CXF 对象传递 附

    这些文件对于理解 CXF 应用的构建和开发环境至关重要。 通过以上介绍,我们可以看到CXF在处理对象传递时的灵活性和便利性。了解这些基础知识,开发者可以更高效地创建和使用Web服务,实现复杂数据类型的交互。在...

    cxf 开发web services apache 官方文档

    根据提供的文件信息,我们可以深入探讨 CXF 在开发 Web Services 方面的应用及其实现细节。以下是对标题、描述、标签以及部分内容中的关键知识点进行的详细解释。 ### 一、CXF 概述 #### 标题:“cxf 开发web ...

    apache-cxf-3.0.0

    2. **库文件**:各种依赖的JAR包,包括CXF自身的实现和依赖的第三方库,用于构建和运行CXF应用。 3. **文档**:可能包含API文档、用户指南和开发者手册,帮助用户理解和使用CXF。 4. **示例**:CXF通常会提供一些...

    apache-cxf-2.7.12

    5. **构建脚本**:如Ant或Maven的构建脚本,帮助用户构建和打包CXF应用。 使用"apache-cxf-2.7.12"时,开发者需要根据自己的项目需求选择合适的组件,配置相应的服务和客户端,然后利用CXF提供的工具和API进行开发...

    cxf多数据源配置

    "多数据源"这个标签提示我们,我们将探讨的是如何在CXF应用中配置多个数据源,以便可以同时连接和操作多个数据库或其他数据提供者。这通常涉及到Spring框架,因为CXF经常与Spring结合使用,利用其强大的依赖注入和...

Global site tag (gtag.js) - Google Analytics