使用客户端存根时,前缀为null

时间:2013-01-08 14:51:35

标签: soap null axis rpc prefix

我必须使用axis来生成存根,因为我正在使用的SOAP使用RPC。设置代码后发布我收到下面的堆栈跟踪。如果有人有这个问题,请帮助。从使用Eclipse中的调试工具我可以看到Axis使用默认前缀,但问题是它使用的前缀之一已经被使用,因此它返回null。有谁知道为什么会这样?

AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
 faultSubcode: 
 faultString: java.io.IOException: java.io.IOException: Non nillable element 'prefix' is null.
 faultActor: 
 faultNode: 
 faultDetail: 
    {http://xml.apache.org/axis/}stackTrace:java.io.IOException: java.io.IOException: Non nillable element 'prefix' is null.
    at org.apache.axis.encoding.ser.BeanSerializer.serialize(BeanSerializer.java:275)
    at org.apache.axis.encoding.SerializationContext.serializeActual(SerializationContext.java:1504)
    at org.apache.axis.encoding.SerializationContext.serialize(SerializationContext.java:980)
    at org.apache.axis.encoding.SerializationContext.outputMultiRefs(SerializationContext.java:1055)
    at org.apache.axis.message.SOAPBody.outputImpl(SOAPBody.java:145)
    at org.apache.axis.message.SOAPEnvelope.outputImpl(SOAPEnvelope.java:478)
    at org.apache.axis.message.MessageElement.output(MessageElement.java:1208)
    at org.apache.axis.client.Call.invoke(Call.java:2757)
    at org.apache.axis.client.Call.invoke(Call.java:2443)
    at org.apache.axis.client.Call.invoke(Call.java:2366)
    at org.apache.axis.client.Call.invoke(Call.java:1812)

1 个答案:

答案 0 :(得分:4)

虽然这个问题在一年之后没有得到解答,但我认为它可能会对你有所帮助,因为你正在使用RPC而且可能是遗留系统。

在生成的客户端存根中,Apache Axis的打包结尾为“_xsd”,其中创建了Web服务提供者的对象,逐个打开类。 在课程中间的某个地方你会发现一个像这样的静态块代码:

 static {
    typeDesc.setXmlType(...);
    org.apache.axis.description.ElementDesc elemField = new org.apache.axis.description.ElementDesc();
    elemField.setFieldName("prefix");
    elemField.setXmlName(new javax.xml.namespace.QName("", "prefix"));
    elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
    elemField.setNillable(false);
    typeDesc.addFieldDesc(elemField);
}

只需将nillable的值更改为true即可:

elemField.setNillable(true);

如果这些类与WSDL中的相应值不匹配,则应对这些类的所有类和所有字段重复此操作(即,基于WSDL的定义,它们可以为空)。

我注意到Apache Axis 1.2 - 1.4默认情况下会自动使属性不是“nillable”。我不知道为什么会这样,但我认为这是解决方案。