随笔-124  评论-194  文章-0  trackbacks-0
最近想用PERL通过SOAP与JAVA通信,想到了XFIRE,现在叫CXF提供的服务。但总是差一点成功。

第一步,
由于用了SPRING,所以最先看了这篇文章:Writing a service with Spring
服务是建成功了,PERL和JAVA是可以正常通信了,详见上篇文章
可是CXF自己的CLIENT生成代码却访问“自定义结构数组”的函数不成功:
 public List<DeviceValue> sendAlarmArr (List<DeviceValue> arr);

第二步,
左试右试不成功,甚至去试了Axis2,但那个生成的WSDL把上面的结构变成AnyType,估计不对。
又回来,看了Aegis绑定,我还找到将它用到SPRING里的方法:
<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" />

   
<bean id="serviceClass" class="com.exchangebit.nms.magic.NotifyServiceImpl"/>
  
    
<bean id="aegisDatabinding" class="org.apache.cxf.aegis.databinding.AegisDatabinding"/>
          
    
<bean id="serviceFactory" class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean">
        
<property name="dataBinding" ref="aegisDatabinding"/>
    
</bean>
    
    
<bean id="serverBeanFactory" class="org.apache.cxf.frontend.ServerFactoryBean" init-method="create">
        
<property name="address" value="/NotifyService"/>
        
<property name="bindingId" value="http://schemas.xmlsoap.org/soap/"/>
        
<property name="serviceBean" ref="serviceClass"/>
        
<property name="serviceFactory" ref="serviceFactory"/>
    
</bean>

    
<jaxws:endpoint 
      
id="notifyService" 
      implementor
="com.exchangebit.nms.magic.NotifyServiceImpl" 
      address
="/NotifyService">
         
<!--jaxws:serviceFactory>
            <ref bean="serviceFactory"/>
         </jaxws:serviceFactory
-->
     
</jaxws:endpoint>
   
</beans>


其实,跟前一种JAX-WS的方式转换非常简单,把其中的注释去掉就是Aegis绑定,注释掉就是JAX-WS。
客户端没有在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信息也会出错。
不知如何解,先记在此,以后回过头来再研究了。
posted on 2007-08-07 21:39 我爱佳娃 阅读(2898) 评论(1)  编辑  收藏 所属分类: Perlweb技术

评论:
# re: CXF:咋总差一点呢? 2011-05-10 22:58 | lty
请问您cxf返回复杂类型怎么做呢?  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: