我们有一个AXIS2 v1.5.2中实现的POJO Web服务,该服务在Apache2 Web服务器后面的Tomcat 6中运行。
出于演示目的,我将重点介绍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
我看到的是该服务使我的请求保持原样。
从以下位置在日志中打印的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。
我知道这是一个很长的问题,但我认为我不妨将所有这些信息都预先添加。
最佳答案
原来是AXIS2 1.5中的错误。
一些详细信息here
缺陷在2011年1月6日的每晚构建中得到解决。仍在等待确认有关解决此问题的确切方法。线程中讨论了几个解决方案。
我暂时使用了最明显的答案,并亲自修补了代码。