深入剖析Axis2中参数为复杂自定义类型值【步步逼近实践篇】
来源:互联网 发布:软件版权所有格式 编辑:程序博客网 时间:2024/05/17 22:38
问:Axis2中到底能否传递复杂以及自定义对象?
答:肯定可以
上篇博客深入剖析Axis2中返回值为自定义对象以及复杂类型,比如:List<User>类型。
那这篇博客我们继续讲解,讲一下Axis2中参数为自定义对象,如User对象或List<User>参数。
首先说参数为User对象。
服务器端照常如旧。还是用最初的文档中方式搭建。其中有个方法如下:
public User getUserName(User u){ User user= new User(); user.setAge(u.getAge()+10); user.setName( "^"+u.getName()+ "^"); user.setId(u.getId()+1); return user; }
那我们客户端如何传递过去呢?
当然我们还是使用Axiom方式。
因为在Axiom中,传递的参数必须为OMElement类型。所以呢。我们必须把我们自定义的对象转化成OMElement对象。
那如何转化呢?
//把user对象转化成相应的omElment对象 public static OMElement castElment(User u){ javax.xml.stream.XMLStreamReader reader = BeanUtil.getPullParser(u); StreamWrapper parser = new StreamWrapper(reader); StAXOMBuilder stAXOMBuilder =OMXMLBuilderFactory.createStAXOMBuilder(OMAbstractFactory. getOMFactory(), parser); OMElement element = stAXOMBuilder.getDocumentElement(); return element; }
那我们我们继续分析转换后的OMElement结果?
OMElement param=castElment(u);
//输出转换后的omElement对象
System. out.println(param);
结果如下:
<User><age>10</age><id>0</id><name>李四</name></User>
实际上传递的是一串xml
main方式如下:
public static void main(String[] args) throws Exception { EndpointReference targetEPR = new EndpointReference("http://localhost:8080/testWSServerByAxis2/services/myService?wsdl" ); try { Options options = new Options(); options.setTo(targetEPR); //加载目标服务器 ServiceClient sender = new ServiceClient(); sender.setOptions(options); OMFactory fac = OMAbstractFactory.getOMFactory(); OMNamespace omNs = fac.createOMNamespace("http://test.com" , "" ); //调用服务端的方法 OMElement method = fac.createOMElement("getUserName" , omNs); //给方法赋值参数值,参数值只能是omNode形式。所以需要把自定义对象转成omNode对象 //调用把自定义对象转化成omNode对象 User u= new User(); u.setId(0); u.setAge(10); u.setName( "李四"); OMElement param= castElment(u); //输出转换后的omElement对象 System.out.println(param); method.addChild(param); //返回OMElement对象 OMElement result = sender.sendReceive(method); System.out.println("clientResult="+result); Iterator iterator=result.getChildElements(); while(iterator.hasNext()){ System.out.println("ok"); OMNode omNode = (OMNode) iterator.next(); if(omNode.getType()==omNode. ELEMENT_NODE){ OMElement omElement = (OMElement) omNode; System.out.println("***="+omElement.getLocalName()); if (omElement.getLocalName().toLowerCase().equals("return" )) { User u1 = (User) BeanUtil.processObject(omElement, User. class, null, true, new DefaultObjectSupplier()); System.out.println(u1.getName()); } } } } catch (Exception e) { e.printStackTrace(); } }
还是按照上篇博客的返回值,得到的结果如下:
clientResult=<ns:getUserNameResponse xmlns:ns="http://test.com"><ns:return xmlns:ax21="http://entity.com/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ax21:User"><ax21:age>20</ax21:age><ax21:id>1</ax21:id><ax21:name>^李四^</ax21:name></ns:return></ns:getUserNameResponse>
其次,若传递List<User>对象呢?
大家想想,List,如何传递呢?转化成消息又是在怎么样的呢?
因为传递参数必须为OmElement,那我们看一下List如何转化的OmElement对象呢?
//把List对象转化成相应的omElment对象 public static OMElement castElment(List<User> userList){ // 构建 OMFactory 工厂 OMFactory factory = OMAbstractFactory. getOMFactory(); OMNamespace omNamespace = factory.createOMNamespace("http://test.com" , "" ); OMElement omElement = BeanUtil. getOMElement(new QName("root"), userList.toArray(), new QName("user"), false, null); return omElement; }
那转换后的输出结果是:
<root><user><age>10</age><id>0</id><name>李四0</name></user><user><age>11</age><id>1</id><name>李四1</name></user><user><age>12</age><id>2</id><name>李四2</name></user></root>
注意观察输出的OMElement。其中是由use标签包含的。这样下次获得这样的List返回值的OMElement,则只要把user中的取出然后封装成对象即可。
另外还需要注意:BeanUtil. getOMElement方法中的第一个参数,不能为null,输出的是在对象外有一层标签。第三个参数是封装对象的标签的命名。
这样话Axis2基本上可以正常投入使用中。虽然Axis2中使用axiom方式可以处理复杂自定义类型,但是说实话还是需要进行转化。但是在CXF中,其实没有怎么麻烦。直接传递即可。
但是正所谓人无完人,Axis2中接口参数是什么,发布服务后生成的wsdl上的element的命名则与接口参数命名是一样的。但是在CXF中,却不同。CXF若不用注解的方式改命名,则默认情况则是arg0,arg1.
因此,对于任何事物,或者对于我们自己也好,都应该扬长避短。(*^__^*)
- 深入剖析Axis2中参数为复杂自定义类型值【步步逼近实践篇】
- 深入剖析Axis2中返回值为复杂自定义类型值【步步逼近实践篇】
- Axis2到底能否传递复杂类型参数【求指导篇】
- Axis2传递、返回复杂类型的对象
- axis2使用教程、webservices自定义参数,webservices自定义返回值
- SOAP中复杂类型(JavaBean)调用实例实践
- SOAP中复杂类型(JavaBean)调用实例实践 (转)
- springMVC 参数传递之:数组,Map,List,Set以及自定义复杂类型参数
- WCF复杂类型参数传输
- STL中hash_map深度剖析—使用自定义类型
- ibatis 复杂类型(用户自定义类型)
- web service axis2 参数为对象传递
- fastjson:对于Exception中复杂类型(enum,...以及自定义类型)成员的处理
- mybatis中使用map类型参数,其中key为列名,value为列值
- 以复杂结构体为参数在子函数中进行赋值,并返回值给主函数
- JNI步步深入
- Axis2实践
- axis2实践
- 365. Proverbs are the daughters of daily experience. 谚语是日常经验的结晶
- 20、栈和队列
- vim配置简介2
- 重新组织和重新生成索引sp_RefreshIndex
- vim常用插件3
- 深入剖析Axis2中参数为复杂自定义类型值【步步逼近实践篇】
- The Phantom of the Opera-8、Where is Christine Daae?
- 揣测2013年:Android和iOS能分出胜负吗?
- 使用Ghost备份、还原系统
- 多块网卡的绑定获取
- 21、集合之Set之hashCode和equals
- Java的JDBC事务详解
- android mediaplya 状态
- Google Earth 3D 开发文档