我必须使用 axis 来生成 stub ,因为我正在使用的 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)
最佳答案
虽然这个问题在一年后没有得到解答,但我认为它可能会对您有所帮助,因为您正在使用 RPC 并且可能是遗留系统。
在您生成的带有 Apache Axis 的客户端 stub 中,该 stub 以“_xsd”结尾,其中 Web 服务提供者的对象被一一创建为开放类。 在类中间的某个地方,您会发现如下静态 block 代码:
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”。我不知道为什么会这样,但我认为这就是解决方案。
关于soap - 使用客户端 stub 时前缀为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14217597/