1

私が使用している SOAP は RPC を使用しているため、スタブを生成するために軸を使用する必要がありました。投稿するコードを設定した後、以下のスタック トレースを受け取ります。誰かがこの問題を抱えている場合は、助けてください。Eclipse でデバッグ ツールを使用すると、Axis がデフォルトのプレフィックスを使用していることがわかりますが、問題は、Axis が使用するプレフィックスの 1 つが既に使用されているため、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

この質問は 1 年経っても回答されていませんが、RPC とおそらくレガシー システムを使用しているので、役立つかもしれないと思いました。

"_xsd" で終わるパッケージの下にある Apache Axis を使用して生成されたクライアント スタブで、Web サービス プロバイダーのオブジェクトが作成され、クラスを 1 つずつ開きます。クラスの途中に、次のような静的ブロック コードがあります。

 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 の定義に基づいて null 可能である場合) は、すべてのクラスとそれらのクラスのすべてのフィールドに対してこのアクションを繰り返す必要があります。

私は、Apache Axis 1.2 - 1.4 がデフォルトで自動的に属性を「nillable」にしないことに気付きました。なぜこれが当てはまるのかわかりませんが、これが解決策だと思います。

于 2014-02-01T13:09:14.493 に答える