大家好,用xfire做了一个webservice,我服务器端和客户端都实现了值传递javabean。 
现在要扩展一些功能,就是 客户段传递的复杂对象; 
   客户端-----》服务器端 1.客户端发送sendFunction(List):这个list里面封装的是javabean,服务器端返回 boolean型数据 
   客户端-----》服务器端  2.客户端发送getList(String str):要求服务器端返回一个list<javabean> 
   客户端-----》服务器端  3.客户端发送modList(String[] str):服务器端返回 boolean型数据 
   客户端-----》服务器端  4.客户端发送getListData(String str):服务器端返回 String[]数组 
请问有哪位对这个比较熟悉,能否指点一下,或者给我一份参考,我在网上找了,但是也没有实现。 
谢谢! 

解决方案 »

  1.   

    将复杂对象统统转成xml,既保证异构系统也可使用,又降低传递的数据量,提高性能。
    可尝试一下XStream。
      

  2.   

    很简单,分两步:
    (1)在webservice工程下的WEB-INF增加一个配置文件server-config.wsdd,内容如下
    <?xml version="1.0" encoding="UTF-8"?>
    <deployment xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    <globalConfiguration>
    <parameter name="adminPassword" value="admin" />
    <parameter name="enableNamespacePrefixOptimization"
    value="true" />
    <parameter name="dotNetSoapEncFix" value="true" />
    <parameter name="disablePrettyXML" value="true" />
    <parameter name="sendXsiTypes" value="true" />
    <parameter name="sendMultiRefs" value="true" />
    <parameter name="sendXMLDeclaration" value="true" />
    <requestFlow name="RequestFlow1">
    <handler name="Handler1"
    type="java:org.apache.axis.handlers.JWSHandler">
    <parameter name="scope" value="session" />
    </handler>
    <handler name="Handler2"
    type="java:org.apache.axis.handlers.JWSHandler">
    <parameter name="scope" value="request" />
    <parameter name="extension" value=".jwr" />
    </handler>
    </requestFlow>
    </globalConfiguration>
    <responseFlow name="ResponseFlow1">
    <handler name="Handler1" type="LocalResponder" />
    </responseFlow>
    <handler name="Handler1" type="LocalResponder" />
    <handler name="LocalResponder"
    type="java:org.apache.axis.transport.local.LocalResponder" />
    <handler name="URLMapper"
    type="java:org.apache.axis.handlers.http.URLMapper" />
    <handler name="Authenticate"
    type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />
    <handler name="Handler2"
    type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />
    <requestFlow name="RequestFlow1">
    <handler name="Handler1" type="URLMapper" />
    <handler name="Handler2"
    type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />
    </requestFlow>
    <service name="AdminService" provider="java:MSG">
    <parameter name="allowedMethods" value="AdminService" />
    <parameter name="enableRemoteAdmin" value="false" />
    <parameter name="className" value="org.apache.axis.utils.Admin" />
    <namespace>http://xml.apache.org/axis/wsdd/</namespace>
    </service>
    <service name="Version" provider="java:RPC">
    <parameter name="allowedMethods" value="getVersion" />
    <parameter name="className" value="org.apache.axis.Version" />
    </service> <!-- 开放一个服务 -->
    <service name="gsStatus" provider="java:RPC">
    <parameter name="allowedMethods" value="*" />
    <parameter name="className"
    value="web.GsStatusImp" />
    <parameter name="scope" value="Request" />
    <namespace>nss</namespace>
    <beanMapping languageSpecificType="java:po.DeliveryInformation"
                         qname="ns:Messages"                  
                         xmlns:ns="urn:BeanService"/>
            <beanMapping languageSpecificType="java:po.DeSOAPHeader"
                         qname="ns:DeSOAPHeader"                  
                         xmlns:ns="urn:BeanService"/>
            
    </service>
    <transport name="http">
    <requestFlow name="RequestFlow1">
    <handler name="Handler1" type="URLMapper" />
    <handler name="Handler2"
    type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />
    </requestFlow>
    <parameter name="qs:list"
    value="org.apache.axis.transport.http.QSListHandler" />
    <parameter name="qs:wsdl"
    value="org.apache.axis.transport.http.QSWSDLHandler" />
    <parameter name="qs:method"
    value="org.apache.axis.transport.http.QSMethodHandler" />
    </transport>
    <transport name="local">
    <responseFlow name="ResponseFlow1">
    <handler name="Handler1" type="LocalResponder" />
    </responseFlow>
    </transport>
    </deployment>
    (2)客户端如下:
    package test;import java.net.MalformedURLException;
    import java.rmi.RemoteException;
    import javax.xml.namespace.QName;
    import javax.xml.rpc.ServiceException;
    import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;
    import org.apache.axis.encoding.ser.BeanDeserializerFactory;
    import org.apache.axis.encoding.ser.BeanSerializerFactory;
    import po.DeliveryInformation;
    public class TestWsUseAxis {
    public static void main(String[] args) {
    try {
    String url = "http://219.148.199.4:9082/gsStatusWS/services/gsStatus";//状态报告
    Service service = new Service();
    Call call = (Call) service.createCall();
    QName qn = new QName("urn:BeanService","Messages");
    call.registerTypeMapping(DeliveryInformation.class,qn,new BeanSerializerFactory(DeliveryInformation.class, qn),new BeanDeserializerFactory(DeliveryInformation.class, qn));
    call.setTargetEndpointAddress(new java.net.URL(url));
    call.setOperationName(new QName("http://soapinterop.org/","notifySmsDeliveryReceipt")); //状态报告
    String correlator = "correlator_value";
    DeliveryInformation d = new DeliveryInformation();
    d.setAddress("gz");
    d.setDeliveryStatus("0");
    call.invoke(new Object[]{correlator,d});
    } catch (ServiceException e) {
    e.printStackTrace();
    System.out.println("Service 获取 Call对象失败!");
    } catch (MalformedURLException e) {
    e.printStackTrace();
    System.out.println("new java.net.URL(url)错误!");
    } catch (RemoteException e) {
    e.printStackTrace();
    System.out.println("远程错误!");
    }
    }
    }
      

  3.   

    这个好像不是xfire弄的webservice,我现在想用xfire实现websercie的传递复杂对象,能否指点一下,谢谢!
      

  4.   

    对你说过了,将复杂对象序列化成XML 字符串再传递,不要直接使用复杂对象作参数,而是使用字符串;如果使用复杂对象,你用xfire发布的webservice,.net应用系统或ruby之类的其它异构系统调用不能保证正确性。
      

  5.   

       我这里面有例子哈,http://blog.csdn.net/stoneyang2005/archive/2009/02/24/3931841.aspx,你看一下哪里看不明白请留言。
      

  6.   

    非常感谢stoneyang2005,我看了你的博客,上面写的很好。
    我修改了一下,如果要xfire结合spring,那么这个services.xml可以放到spring中去就可以。
    spring中的配置。
    <bean id="BbtForumService"
    class="org.codehaus.xfire.spring.remoting.XFireExporter">
    <property name="serviceFactory" ref="xfire.serviceFactory" />
    <property name="xfire" ref="xfire" />
    <property name="serviceBean" ref="cmdbServiceImpl" />
    <property name="serviceClass"
    value="com.thbs.interact.webService.IcmdbDAO" />
    <property name="name" value="cmdbService" />
    </bean>
    还有一点不是很明白,就是我把这个配置加到spring中了,但是空的services.xml一定要存在,如果删除这个文件,系统就报错。
      

  7.   

       我想services.xml存在的意思是,既然web.xml 对xfire的类进行了加载,那么xfire相对的META-INF和services.xml就必须存在,不然xfire则不允许部署吧。