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