2011-01-13 107 views
2

我們在Apache2 webserver後面的Tomcat 6中運行的AXIS2 v1.5.2中實現了POJO Web服務。POJO AXIS2 Web服務請求中的參數未傳遞給POJO

爲了演示目的,我將重點介紹validateUser消息和相應的方法。 所有的消息都以類似的方式表現。

我看過this以及其他一些相關的問題,但他們似乎並沒有深入到問題的底部。

當請求發送到服務時,參數將作爲空白傳遞給POJA。

首先WSDL:

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:ns="http://service.icomet.com" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:ax21="http://util.java/xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://service.icomet.com"> 
<wsdl:types> 
    <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://util.java/xsd"> 
     <xs:complexType name="Map"> 
      <xs:sequence> 
       <xs:element minOccurs="0" name="empty" type="xs:boolean"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:schema> 
    <xs:schema xmlns:ax22="http://util.java/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://service.icomet.com"> 
     <xs:import namespace="http://util.java/xsd"/> 
     <xs:element name="validateUser"> 
       <xs:complexType> 
       <xs:sequence> 
        <xs:element name="user" nillable="true" type="xs:string"/> 
        <xs:element name="userPassword" nillable="true" type="xs:string"/> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
</xs:schema> 
</wsdl:types> 
<wsdl:message name="validateUserRequest"> 
    <wsdl:part name="parameters" element="ns:validateUser"/> 
</wsdl:message> 

在org.apache.axis2.rpc.receivers.RPCMessageReceiver,org.apache.axis2.rpc.receivers.RPCUtil和的代碼一起以下後org.apache.axis2.databinding.utils.BeanUtil 我看到的是使用參數完成我的請求的服務。 所述的OMElement印刷在日誌中從:

BeanUtil.deserialize(的OMElement響應, 對象[] javaTypes, ObjectSupplier objectSupplier)看起來像這樣: 反序列化(的OMElement響應, 對象[] javaTypes, ObjectSupplier objectSupplier)

看起來是這樣的:

<SOAP-ENV:Body xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
<ns:validateUser xmlns:ns="http://service.icomet.com"> 
    <ns:user>test</ns:user> 
    <ns:userPassword>values</ns:userPassword> 
</ns:validateUser> 

通話後得到的OMElement的孩子,看着上面的OMElement的第一個孩子我看到這一點:以上的OMElement返回日誌中的多個空行

<ns:validateUser xmlns:ns="http://service.icomet.com"> 
    <ns:user>test</ns:user> 
    <ns:userPassword>values</ns:userPassword> 
</ns:validateUser> 

調用的getText()。

我增加了以下方法:

private static void showElement(OMElement omElement) { 
    System.out.println("onElement class:" + omElement.getClass().getName()); 
    System.out.println("omElement:" + omElement); 
    System.out.println("omElement.getText:" + omElement.getText()); 
    for (Iterator it = omElement.getChildElements(); it.hasNext();) { 
     Object object = it.next(); 
     System.out.println("child class name:" + object.getClass().getName()); 
     System.out.println("child to string:" + object); 

    } 

    for (Iterator it = omElement.getAllAttributes(); it.hasNext();) { 
     OMAttribute object = (OMAttribute) it.next(); 
     System.out.println("OMAttribute:" + object.getAttributeValue()); 
    } 
} 

到BeanUtil類,以便在此的OMElement更好看。此代碼返回如下:

onElement class:org.apache.axiom.om.impl.llom.OMElementImpl 
omElement:<ns:validateUser xmlns:ns="http://service.icomet.com"> 
    <ns:user>test</ns:user> 
    <ns:userPassword>values</ns:userPassword> 
</ns:validateUser 

omElement.getText:

child class name:org.apache.axiom.om.impl.llom.OMElementImpl 
child to string:<ns:user xmlns:ns="http://service.icomet.com">test</ns:user> 
child class name:org.apache.axiom.om.impl.llom.OMElementImpl 
child to string:<ns:userPassword xmlns:ns="http://service.icomet.com">values</ns:userPassword> 

所以,我看到的值。他們到達並進入門口可以這麼說。但是,由於org.apache.axis2.databinding.typemapping.SimpleTypeMapper.getSimpleTypeObject調用OMElement上的getText並返回一個空字符串,因此RPCUtil.processRequest方法正在返回一個具有空字符串和空對象的對象數組,並且這會傳遞給POJO。

我知道它的一個很長的問題,但我想我可能還會在前面添加所有這些信息。

回答

1

原來是AXIS2 1.5中的一個bug。

一些細節被發現here

在夜間建立在1/6/2011缺陷被解決。仍在等待確認究竟是如何解決問題的。線程中討論了一些解決方案。

我使用了最明顯的答案,並且自己修補了代碼。