webservice如何传递复杂参数和自定义参数

首先说参数为User对象。

服务器端照常如旧。还是用最初的文档中方式搭建。其中有个方法如下:

 

[html] view plaincopyprint?

1.  public User getUserName(User u){  

2.          User usernew User();  

3.          user.setAge(u.getAge()+10);  

4.          user.setName( "^"+u.getName()+ "^");  

5.          user.setId(u.getId()+1);  

6.           return user;  

7.    }  

   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对象。

 那如何转化呢?

 

[html] view plaincopyprint?

1.  //把user对象转化成相应的omElment对象  

2.    public static OMElement castElment(User u){  

3.            javax.xml.stream.XMLStreamReader reader = BeanUtil.getPullParser(u);  

4.            StreamWrapper parser = new StreamWrapper(reader);  

5.            StAXOMBuilder stAXOMBuilder =OMXMLBuilderFactory.createStAXOMBuilder(OMAbstractFactory. getOMFactory(), parser);  

6.            OMElement element = stAXOMBuilder.getDocumentElement();  

7.            return element;  

8.    }  

   //把user对象转化成相应的omElment对象

     public static OMElement castElment(Useru){

             javax.xml.stream.XMLStreamReaderreader = BeanUtil.getPullParser(u);

             StreamWrapper parser = newStreamWrapper(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方式如下:

 

[html] view plaincopyprint?

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

2.            EndpointReference targetEPR = new EndpointReference("http://localhost:8080/testWSServerByAxis2/services/myService?wsdl" );  

3.      try {  

4.                 Options options = new Options();  

5.                 options.setTo(targetEPR);  

6.                   

7.                  //加载目标服务器  

8.                 ServiceClient sender = new ServiceClient();  

9.                 sender.setOptions(options);  

10.                   

11.                 OMFactory fac = OMAbstractFactory.getOMFactory();  

12.                 OMNamespace omNs = fac.createOMNamespace("http://test.com" , "" );  

13.                  //调用服务端的方法  

14.                 OMElement method = fac.createOMElement("getUserName" , omNs);  

15.                  //给方法赋值参数值,参数值只能是omNode形式。所以需要把自定义对象转成omNode对象  

16.                  //调用把自定义对象转化成omNode对象  

17.                 User unew User();  

18.                 u.setId(0);  

19.                 u.setAge(10);  

20.                 u.setName( "李四");  

21.                 OMElement paramcastElment(u);  

22.                  //输出转换后的omElement对象  

23.                  System.out.println(param);  

24.                 method.addChild(param);  

25.                  //返回OMElement对象  

26.                 OMElement result = sender.sendReceive(method);  

27.                  System.out.println("clientResult="+result);  

28.                  Iterator iterator=result.getChildElements();  

29.                  while(iterator.hasNext()){  

30.                       System.out.println("ok");  

31.                      OMNode omNode = (OMNode) iterator.next();  

32.                       if(omNode.getType()==omNode. ELEMENT_NODE){  

33.                            OMElement omElement = (OMElement) omNode;  

34.                            System.out.println("***="+omElement.getLocalName());  

35.                             if (omElement.getLocalName().toLowerCase().equals("return" )) {  

36.                                 User u1 = (User) BeanUtil.processObject(omElement, User. class, null, true, new DefaultObjectSupplier());  

37.                                  System.out.println(u1.getName());  

38.                            }  

39.                      }  

40.                 }  

41.            } catch (Exception e) {  

42.                 e.printStackTrace();  

43.            }  

44.      }  

 public static void main(String[] args) throwsException {

           EndpointReference targetEPR = newEndpointReference("http://localhost:8080/testWSServerByAxis2/services/myService?wsdl");

     try {

                Options options = newOptions();

                options.setTo(targetEPR);

               

                 //加载目标服务器

                ServiceClient sender = newServiceClient();

                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, newDefaultObjectSupplier());

                                System.out.println(u1.getName());

                           }

                     }

                }

           } catch (Exception e) {

                e.printStackTrace();

           }

     }

 

  还是按照上篇博客的返回值,得到的结果如下:

 

[html] view plaincopyprint?

1.  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>  

  clientResult=<ns:getUserNameResponsexmlns:ns="http://test.com"><ns:returnxmlns: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对象呢?

  

[html] view plaincopyprint?

1.  //把List对象转化成相应的omElment对象  

2.  ublic static OMElement castElment(List<User> userList){  

3.        // 构建 OMFactory 工厂  

4.        OMFactory factory = OMAbstractFactory. getOMFactory();  

5.       OMNamespace omNamespace = factory.createOMNamespace("http://test.com" , "" );  

6.       OMElement omElement = BeanUtil. getOMElement(new QName("root"), userList.toArray(), new QName("user"), false, null);  

7.        return omElement;      

      //把List对象转化成相应的omElment对象

     public static OMElementcastElment(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;   

     }

 那转换后的输出结果是:

[html] view plaincopyprint?

1.  <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>  

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值