请求POJO AXIS2 Web服务的参数不会传递给POJO

时间:2011-01-13 16:46:44

标签: java wsdl axis2

我们在AXIS2 v1.5.2中实现了一个POJO Web服务,该服务在Apache2 webserver后面的Tomcat 6中运行。

出于演示目的,我将重点介绍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的代码中跟随之后 我所看到的是服务获得我的请求完整的params。 OMElement打印在以下日志中:

BeanUtil.deserialize(OMElement响应,             Object [] javaTypes,             ObjectSupplier objectSupplier)如下所示:     反序列化(OMElement响应,             Object [] 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的第一个孩子后,我看到了:

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

在上面的OMElement上调用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 个答案:

答案 0 :(得分:1)

原来是AXIS2 1.5中的错误。

可以找到一些细节here

缺陷在2011年1月6日的夜间建筑中得到解决。仍在等待确认究竟是如何解决问题的。线程中讨论了几个解决方案。

我目前使用了最明显的答案,并自己修补了代码。