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

axis1.4 传递嵌套list的复杂对象

 
阅读更多
项目需要,发布webservice服务端,向客户端传递复杂对象。对象包含了list<>,反复研究了一下,发现webservice不能够直接传递list对象,必须转换成对象数组才能传递。javaBean:

1.package com.wensi.service.server;   
2.  
3.import java.io.Serializable;   
4.  
5.public class LoginResponse implements Serializable{   
6.    private boolean flag;//操作员登录验证是否通过:true 验证通过  false 验证失败   
7.    private OperatorBean operator;//登录成功后返回的操作员信息,登录失败返回null   
8.    private AuthorityBean[] authorityArray;//登录成功后返回操作员的权限,登录失败返回null   
9.    private String checkNum;//校验码   
10.       
11.    public boolean isFlag() {   
12.        return flag;   
13.    }   
14.    public void setFlag(boolean flag) {   
15.        this.flag = flag;   
16.    }   
17.    public OperatorBean getOperator() {   
18.        return operator;   
19.    }   
20.    public void setOperator(OperatorBean operator) {   
21.        this.operator = operator;   
22.    }   
23.    public AuthorityBean[] getAuthorityArray() {   
24.        return authorityArray;   
25.    }   
26.    public void setAuthorityArray(AuthorityBean[] authorityArray) {   
27.        this.authorityArray = authorityArray;   
28.    }   
29.    public String getCheckNum() {   
30.        return checkNum;   
31.    }   
32.    public void setCheckNum(String checkNum) {   
33.        this.checkNum = checkNum;   
34.    }   
35.}  


这是一个复杂的自定义对象,该对象嵌套了基本类型、自定义对象以及自定义对象数组。其余的对象我就不细说了,来看一下,axis1.4用来发布服务的wsdd文件:
1.<?xml version="1.0" encoding="UTF-8"?>   
2.<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">   
3. <handler type="java:org.apache.axis.handlers.http.URLMapper" name="URLMapper"/>   
4. <handler type="java:com.wensi.service.server.BSHeaderHandler" name="BSHeaderHandler"/>   
5. <service name="ZNWService" provider="java:RPC">   
6.    
7.  <requestFlow>     
8.       <handler type="BSHeaderHandler"/>     
9.  </requestFlow>    
10.    
11.  <parameter name="className" value="com.wensi.service.server.ZNWService"/>   
12.  <parameter name="allowedMethods" value="*"/>   
13.  <parameter name="scope" value="session"/>   
14.       
15.<!-- 这里定义了方法的参数以及返回值 -->    
16. <operation name="login" returnType="ns:LoginResponse">   
17.    <parameter name="userName" type="tns:string"/>   
18.    <parameter name="password" type="tns:string"/>   
19.  </operation>   
20.  
21.<!-- 这里定义了自定义对象的映射 -->   
22.  <typeMapping    
23.      qname="ns:OperatorBean"  
24.      xmlns:ns="ZNWService"  
25.      type="java:com.wensi.service.server.OperatorBean"  
26.      deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"      
27.      encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"  
28.      serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"  
29.  />    
30.  
31.   <typeMapping    
32.      qname="ns:AuthorityBean"  
33.      xmlns:ns="ZNWService"  
34.      type="java:com.wensi.service.server.AuthorityBean"  
35.      deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"      
36.      encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"  
37.      serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"  
38.  />    
39.        
40.  <arrayMapping    
41.      qname="ns:ArrayOfAuthorityBean"  
42.      xmlns:ns="ZNWService"  
43.      type="java:com.wensi.service.server.AuthorityBean[]"  
44.      innerType="ns:AuthorityBean"  
45.      xmlns:ns2="ZNWService"  
46.      deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory"      
47.      encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"  
48.      serializer="org.apache.axis.encoding.ser.ArraySerializerFactory"  
49.         
50. />    
51.    
52.  <typeMapping    
53.      qname="ns:LoginResponse"  
54.      xmlns:ns="ZNWService"  
55.      type="java:com.wensi.service.server.LoginResponse"  
56.      deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"      
57.      encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"  
58.      serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"  
59.  />     
60.     
61.   </service>   
62. <transport name="http">         
63.    <requestFlow>         
64.        <handler type="URLMapper"/>         
65.    </requestFlow>         
66.  </transport>    
67.</deployment>
 


注意:<transport name="http">     
    <requestFlow>     
        <handler type="URLMapper"/>     
    </requestFlow>     
  </transport>
如果没有该配置,将无法在浏览器中显示wsdl详细信息。

<handler type="java:com.wensi.service.server.BSHeaderHandler" name="BSHeaderHandler"/>

<requestFlow> 
       <handler type="BSHeaderHandler"/> 
</requestFlow>
是实现一个相当于拦截器的功能,客户端在调用服务端的接口之前,必须经过这个方法的处理。

在这里,我写了一个权限验证的拦截器,代码如下:

1.package com.wensi.service.server;   
2.  
3.import org.apache.axis.AxisFault;      
4.import org.apache.axis.Message;      
5.import org.apache.axis.MessageContext;      
6.import org.apache.axis.handlers.BasicHandler;      
7.import javax.xml.soap.SOAPException;      
8.import javax.xml.soap.SOAPHeader;      
9.import org.apache.axis.message.SOAPHeaderElement;      
10.import org.apache.axis.message.SOAPEnvelope;      
11.import org.apache.axis.message.MessageElement;      
12.  
13.import com.wensi.common.Util;   
14.  
15.import javax.xml.namespace.QName;      
16.  
17.import java.text.ParseException;   
18.import java.text.SimpleDateFormat;   
19.import java.util.Date;   
20.import java.util.Iterator;   
21.import java.util.Map;   
22.  
23.@SuppressWarnings("unchecked")   
24.public class BSHeaderHandler extends BasicHandler {      
25.    private static final long serialVersionUID = 1L;    
26.    private String operNum;//操作员编号   
27.    private String checkNum;//校验码   
28.    private String time;//访问接口的时间   
29.    String endpoint = ServiceConstant.endpoint;//webservice的具体路径   
30.    Map map = ServiceConstant.checkMap;//包含校验码信息的map   
31.       
32.    // 在执行service前先处理handler      
33.    // invoke()会被自动调用,而且 SOAP 信息可以由 msgContext 取得      
34.    public void invoke(MessageContext msgContext) throws AxisFault {      
35.        boolean processedHeader = false;      
36.        try {      
37.            // 取得 Request 的 SOAP 信息      
38.            Message msg = msgContext.getRequestMessage();      
39.            SOAPEnvelope envelope = msg.getSOAPEnvelope();      
40.            SOAPHeader header = envelope.getHeader();      
41.            Iterator it = header.examineAllHeaderElements();      
42.            SOAPHeaderElement hel;      
43.            while (it.hasNext()) {      
44.                hel = (SOAPHeaderElement) it.next();      
45.                String headerName = hel.getNodeName();      
46.                if (headerName.equals("cp:MessageHeader")) {      
47.                    // 对于 mustUnderstand 设为 true 的 Header,必须      
48.                    // 利用下列的方式把它设为"已经处理",否则 service      
49.                    // 会回传 Did not understand "MustUnderstand"      
50.                    hel.setProcessed(true);      
51.                    checkUser(hel);      
52.                    processedHeader = true;      
53.                }      
54.            }      
55.        } catch (SOAPException e) {      
56.            throw new AxisFault("无法处理 SOAP Header.", e);      
57.        }      
58.        if (!processedHeader) {      
59.            throw new AxisFault("接收 SOAP Header 失败");      
60.        }      
61.    }      
62.    private void checkUser(SOAPHeaderElement hel) throws AxisFault {    
63.        String current = Util.dateToString(new Date(), "yyyy-MM-dd HH:mm:ss");//当前时间字符串   
64.        MessageElement element1 = hel.getChildElement(new QName(      
65.                endpoint, "isLogin"));      
66.         
67.        MessageElement element2 = hel.getChildElement(new QName(      
68.                endpoint, "operNum"));   
69.           
70.        MessageElement element3 = hel.getChildElement(new QName(      
71.                endpoint, "checkNum"));      
72.      
73.        MessageElement element4 = hel.getChildElement(new QName(      
74.                endpoint, "time"));      
75.           
76.           
77.        //用户访问的不是登录接口,则进行校验码验证   
78.        if(null == element1 && null != element2 && null != element3 && null != element4){   
79.            operNum = element2.getValue();   
80.            checkNum = element3.getValue();   
81.            time = element4.getValue();   
82.            Boolean flag1 = false;   
83.            if(map.keySet().contains(operNum)){   
84.                CheckNumBean check = (CheckNumBean) map.get(operNum);   
85.                System.out.println(check.getCheckNum());   
86.                if(check.getCheckNum().equals(checkNum)){   
87.                    flag1 = true;   
88.                }   
89.            }   
90.                   
91.            Boolean flag2 = false;   
92.            if(flag1){   
93.                //计算服务器时间与soapHeader时间戳之间的差值   
94.                Long between = countTime(time,current);   
95.                //时差在一个小时之内,算正常   
96.                if(Math.abs(between) < 3600L){   
97.                    flag2 = true;   
98.                }   
99.            }   
100.               
101.            if(!(flag1 && flag2)){   
102.                throw new AxisFault("校验失败");   
103.            }   
104.               
105.            //更新map内信息   
106.            CheckNumBean check = (CheckNumBean) map.get(operNum);   
107.            check.setLastTime(check.getCurrentTime());   
108.            check.setCurrentTime(current);     
109.        } else if(null == element1 && (null == element2 || null == element3 || null == element4)){   
110.            throw new AxisFault("校验失败");   
111.        }   
112.    }    
113.       
114.    //计算时间差   
115.    private Long countTime(String str1, String str2){   
116.      SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");      
117.      Date begin = null;   
118.      Date end = null;   
119.    try {   
120.        begin = df.parse(str1);   
121.        end = df.parse(str2);   
122.    } catch (ParseException e) {   
123.        e.printStackTrace();   
124.    }      
125.      long between=(end.getTime()-begin.getTime())/1000;//除以1000是为了转换成秒    
126.      return between;   
127.    }   
128.}    



由于客户端是手持机,而这边的客户端是java ssh架构,所以存储用户信息,正能依靠内存来完成。
客户端调用的时候,需要向soapHeader放验证信息。
客户端代码如下:

1.package com.wensi.service.client;   
2.  
3.  
4.import java.net.MalformedURLException;   
5.import java.net.URL;   
6.import java.rmi.RemoteException;   
7.import java.util.Date;   
8.  
9.import javax.xml.namespace.QName;   
10.import javax.xml.rpc.ParameterMode;   
11.import javax.xml.rpc.ServiceException;   
12.import javax.xml.rpc.encoding.XMLType;   
13.import javax.xml.soap.SOAPElement;   
14.import javax.xml.soap.SOAPException;   
15.  
16.import org.apache.axis.client.Call;   
17.import org.apache.axis.client.Service;   
18.import org.apache.axis.encoding.ser.ArrayDeserializerFactory;   
19.import org.apache.axis.encoding.ser.ArraySerializerFactory;   
20.import org.apache.axis.encoding.ser.BeanDeserializerFactory;   
21.import org.apache.axis.encoding.ser.BeanSerializerFactory;   
22.import org.apache.axis.message.SOAPHeaderElement;   
23.  
24.import com.wensi.common.Util;   
25.import com.wensi.service.server.AccountCustomerBean;   
26.import com.wensi.service.server.AccountFlag;   
27.import com.wensi.service.server.AccountResponse;   
28.import com.wensi.service.server.AuthorityBean;   
29.import com.wensi.service.server.LoginResponse;   
30.import com.wensi.service.server.OperatorBean;   
31.import com.wensi.service.server.ServiceConstant;   
32.  
33.  
34.public class ZNWServiceClient {   
35.    String endpoint = ServiceConstant.endpoint;//webservice的具体路径   
36.    Service service = new Service();//创建service实例   
37.       
38.    public LoginResponse login(String userName,String password) throws Exception{   
39.        SOAPHeaderElement cpHeader = new SOAPHeaderElement(endpoint,"MessageHeader");   
40.        cpHeader.setPrefix("cp");   
41.        cpHeader.setMustUnderstand(true);      
42.        SOAPElement ele = null;   
43.        ele = cpHeader.addChildElement("isLogin");   
44.        ele.addTextNode("true");   
45.           
46.        //创建call实例   
47.        Call call = (Call) service.createCall();   
48.        //将webservice的服务路径加入到call实例中,并为call设置服务的位置   
49.        URL url = new URL(endpoint);   
50.        call.setTargetEndpointAddress(url);   
51.        //调用webservice 的方法   
52.        call.setOperationName("login");   
53.        //序列化对象   
54.        QName qn1 = new QName("urn:ZNWService","OperatorBean");   
55.        call.registerTypeMapping(OperatorBean.class, qn1, new BeanSerializerFactory(OperatorBean.class,qn1), new BeanDeserializerFactory(OperatorBean.class,qn1));   
56.           
57.        QName qn2 = new QName("urn:ZNWService","AuthorityBean");   
58.        call.registerTypeMapping(AuthorityBean.class, qn2, new BeanSerializerFactory(AuthorityBean.class,qn2), new BeanDeserializerFactory(AuthorityBean.class,qn2));   
59.       
60.        QName qn3 = new QName("urn:ZNWService","ArrayOfAuthorityBean");   
61.        call.registerTypeMapping(AuthorityBean[].class, qn3,new ArraySerializerFactory(),new ArrayDeserializerFactory());   
62.           
63.        QName qn4 = new QName("urn:ZNWService","LoginResponse");   
64.        call.registerTypeMapping(LoginResponse.class, qn4, new BeanSerializerFactory(LoginResponse.class,qn4), new BeanDeserializerFactory(LoginResponse.class,qn4));   
65.  
66.        call.addParameter("userName", org.apache.axis.Constants.XSD_STRING,ParameterMode.IN);   
67.        call.addParameter("password", org.apache.axis.Constants.XSD_STRING,ParameterMode.IN);   
68.        call.setReturnType(qn1, LoginResponse.class);   
69.           
70.        call.addHeader(cpHeader);   
71.           
72.        LoginResponse loginRes = (LoginResponse) call.invoke(new Object[]{userName,password});   
73.        return loginRes;   
74.    }      
75.}  


【转载地址】
http://wufeng219219.iteye.com/blog/808807
分享到:
评论

相关推荐

    在axis1.4中传递复杂类型数组参数(ArrayMapping)

    在 Axis1.4 中传递复杂类型数组参数,涉及到的是 Web 服务中的数据绑定和消息处理。Axis 是一个开源的 SOAP 库,它允许开发者创建、部署和使用 Web 服务。在处理复杂类型数组时,ArrayMapping 是 Axis 中的一个关键...

    axis1.4完整包下载

    标题“axis1.4完整包下载”表明我们关注的是Apache Axis的1.4版本,这是一个较早但仍然在某些环境中使用的版本。 在描述中提到,“包含Axis1.4的所有完整包”,这意味着下载包中包含了运行和开发SOAP Web服务所需的...

    WebService axis1.4接口服务序列/反序列复杂项目实例

    在这个"WebService Axis1.4接口服务序列/反序列复杂项目实例"中,我们将深入探讨如何在 Axis1.4 中处理复杂的参数、自定义实体对象的序列化与反序列化,以及客户端的复杂调用。 首先,让我们理解序列化和反序列化的...

    axis1.4生成客户端

    Axis1.4是Apache软件基金会提供的一个开源工具,专门用于处理Web服务,特别是基于SOAP(Simple Object Access Protocol)的Web服务。本文将深入探讨如何使用Axis1.4生成客户端,以及与之相关的知识点。 1. **Web...

    springboot+axis1.4

    而Axis1.4是Apache软件基金会的一个开源项目,它提供了一个SOAP(简单对象访问协议)Web服务框架,用于创建和部署Web服务。 当我们需要在Spring Boot项目中集成Axis1.4来实现Web服务时,我们需要了解以下几个关键...

    axis1.4帮助文档

    Axis1.4是Apache软件基金会开发的一个开源SOAP(简单对象访问协议)库,主要用于构建和部署Web服务。这个版本的Axis是基于Java平台的,它为开发者提供了强大的工具集,以便于实现符合WS-I(Web Services ...

    axis1.4jar包以及WSDL和服务端代码互转方法

    Axis1.4是Apache组织提供的一款基于Java的Web服务框架,它允许开发者轻松地创建、发布和调用Web服务。本文将深入探讨如何使用Axis1.4.jar包以及Eclipse IDE来实现WSDL(Web Service Description Language)和服务端...

    axis1_4 发布webservice 传递对象或返回对象(一)_benet6_新浪博客.mht

    axis1_4 发布webservice 传递对象或返回对象(一)_benet6_新浪博客.mht

    springboot使用axis1.4的demo

    在本文中,我们将深入探讨如何在Spring Boot项目中集成并使用Axis1.4来发布Web服务。Spring Boot以其简化配置和快速开发能力而受到广泛欢迎,而Axis1.4是Apache软件基金会的一个开源项目,主要用于生成和消费SOAP ...

    apache axis1.4实例

    Apache Axis1.4是Apache软件基金会开发的一个开源Web服务框架,专门用于构建和部署Web服务。这个框架在2004年发布,虽然现在已经有些老旧,但因其稳定性、广泛支持和丰富的功能,仍然在很多项目中被使用。本文将深入...

    webservice axis1.4服务实例

    Axis1.4是Apache Axis的一个版本,它是一个流行的开源工具,用于实现和部署Java Web服务。Apache Axis1.4支持SOAP(Simple Object Access Protocol)和WSDL(Web Services Description Language),这两种技术是构建...

    AXIS1.4webservice服务端和客户端例子

    AXIS1.4是Apache软件基金会开发的一个开源Java库,用于构建和使用Web服务。它提供了在Java平台上创建Web服务的工具和API,使得开发者能够快速实现SOAP(Simple Object Access Protocol)通信。在这个"AXIS1.4 ...

    Springboot集成axis1.4的demo

    当我们需要在Spring Boot项目中集成旧版的 Axis1.4 来发布Web服务时,这通常涉及到对传统SOAP(简单对象访问协议)服务的支持。以下将详细讲解如何在Spring Boot应用中集成Axis1.4以及使用wsdd文件发布Web服务。 ...

    apache axis1.4 官网备份

    Apache Axis1.4是历史悠久的一款开源SOAP(Simple Object Access Protocol)服务器和客户端库,它主要用于构建Web服务。这款工具在2003年发布,是Apache软件基金会的一部分,旨在简化XML-RPC和SOAP的实现。由于其...

    axis1.4+activation.jar+mail.jar

    标题 "axis1.4+activation.jar+mail.jar" 指涉的是一个基于Java的Web服务开发工具包,Axis1.4,以及两个必要的库文件:activation.jar和mail.jar。这些组件在Java应用程序中,尤其是涉及到网络通信和邮件处理时扮演...

    axis1.4和axis2相关jar文件

    了解并熟练使用Axis1.4和Axis2的相关jar文件,对于开发和维护Web服务至关重要。这不仅可以帮助开发者快速构建服务,还能确保与现有系统和其他Web服务的互操作性。在实际项目中,应根据具体需求选择适合的版本,同时...

    axis1.4 + document/literal 实例

    在这个“axis1.4 + document/literal 实例”中,我们将深入探讨Axis 1.4框架下的document/literal绑定模式。 首先,让我们理解什么是Axis 1.4。Axis 1.4是Axis的一个早期版本,它提供了一套工具和服务,使得开发者...

    AXIS1.4客户端调用

    AXIS1.4客户端调用是关于Web服务客户端开发的一个主题,主要涉及到使用Apache Axis1.4库来创建和调用SOAP(Simple Object Access Protocol)服务。Apache Axis1.4是一个开源工具,它允许开发者在Java环境中轻松地...

    axis1.4及webService开发教程

    在实际应用中, Axis1.4还可以与其他Java EE组件如EJB、JMS等结合,实现更复杂的业务逻辑。同时,由于Axis1.4支持WS-I(Web Services Interoperability)规范,因此可以保证跨平台、跨语言的互操作性。 总的来说,...

    axis1.4 源码包

    axis1.4 源码包,亲测,好用,放心下载,不必再进行反编译工作

Global site tag (gtag.js) - Google Analytics