2011-01-13 6 views
2

Apache2 Webサーバの背後にあるTomcat 6で動作するAXIS2 v1.5.2にPOJO Webサービスが実装されています。POJO AXIS2 WebサービスへのリクエストのパラメータはPOJOに渡されません

デモンストレーションの目的で、validateUserメッセージと対応するメソッドに焦点を当てます。 すべてのメッセージが同様の方法で動作しています。

私はthisと他のいくつかの関連する質問を見たことがありますが、問題の一番下にはないようです。

リクエストがサービスに送信されると、パラメータはnullとして空白として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 私が見ているのは、paramsをそのまま使ってリクエストを受けているサービスです。 デシリアライズ(OMElement応答、 オブジェクト[] javaTypes、 ObjectSupplier objectSupplier):BeanUtil.deserialize(OMElement応答、 オブジェクト[] javaTypes、 ObjectSupplier objectSupplier)は次のようになり

:からログに印刷 OMElement

次のようになります。

<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上のgetText()を呼び出す

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

はログに複数の空白行を返します。このOMElementでより良い外観を持つようにBeanUtilクラスに

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()); 
    } 
} 

は、私は次のメソッドを追加しました。このコードは、次の値を返します。

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メソッドは空の文字列とnullオブジェクトを含むオブジェクト配列を返します。これはPOJOに渡されます。

私はその長い質問を知っていますが、私はすべての情報を前もって追加するかもしれないと考えました。

答えて

1

AXIS2 1.5のバグです。

here

欠陥は2011年1月6日にナイトリービルドで対処して発見される詳細の一部。問題を解決するために何が正確に行われたかについての確認をまだ待っています。スレッドにはいくつかの解決策がありました。

私は現時点で最も明白な答えを使用し、自分自身でコードを修正しました。