1

我必须使用轴来生成存根,因为我正在使用的 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)
4

1 回答 1

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”。我不知道为什么会这样,但我认为这是解决方案。

于 2014-02-01T13:09:14.493 回答