質問

実際には、Axis 2を使用してJavaでWebサービスを開発しています。 例外をスローするパブリックメソッドを使用して、POJO(Plain Old Java Object)としてサービスを設計しました:

public class MyService {
   public Object myMethod() throws MyException {
        [...]
   }
}

次に、Axis2 antタスクを使用してWSDLを生成しました。 WSDLを使用して、サービスをテストするクライアントスタブを生成します。生成されたコードには、<!> quot; MyExceptionException <!> quot;が含まれています。および<!> quot; myMethod <!> quot;スタブでこれをスローすることを宣言します:

public class MyServiceStub extends org.apache.axis2.client.Stub {
    [...]
    public MyServiceStub.MyMethodResponse myMethod(MyServiceStub.MyMethod myMethod)
    throws java.rmi.RemoteException, MyExceptionException0 {
        [...]
    }
    [...]
}

ただし、キャッチに囲まれたメソッドを呼び出すと、<!> quot; MyExceptionException <!> quot;代わりにAxisFaultを送信するサーバーによって送信されることはありません(RemoteExceptionのサブクラス)。

問題はサーバー側にあると思いますが、どこにあるかわかりません。サービスは、tomcat 5.5サーバー上のaxis2 webappにaarファイルとしてデプロイされます。 services.xmlは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<service name="MyService" scope="application">
    <description></description>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" 
            class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
           class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </messageReceivers>
    <parameter name="ServiceClass">MyService</parameter>
    <parameter name="ServiceTCCL">composite</parameter>
</service>

動作が正常な場合は、例外の使用をドロップします(これはプロジェクトに不可欠ではありません)が、Java2WSDLがカスタム<!> lt; wsdl:fault <!> gt;を生成する理由を慎重に調べています。操作入力<!> amp;出力宣言とWSDL2Javaは、これが使用できない場合、Exceptionクラスを生成します(そして、スタブメソッドでスローすることを宣言します)。

役に立ちましたか?

解決

私は本当に問題があるとは思わない。クライアントはサーバー上のメソッドを呼び出します。その方法では例外が発生します。 Axisはこの例外を、エラーを示すためにクライアントに送信できるものに変換します。

私が知る限り、すべての例外はAxisFaultにラップされ、SoapFaultメッセージとして例外メッセージの説明としてクライアントに送信されます。

つまり、例外(例外クラス)がシリアル化されて送信されないため、クライアントはAxisFaultsのみを参照する必要があります。サーバー例外は、クライアント側でAxisFaultsになります。

他のヒント

Lady4jでAxis2を使用してみたところ、この問題は解決されました。

サービスがカスタムエラーをスローするようにWSDLが指定している場合、クライアントはこれらのエラーとAxis2の操作によってスローされる一般的なリモート例外を処理することを期待する必要があります。

スタブがサーバーからAxisFaultを受信すると、WSDLで指定されている場合、カスタム例外の構築を試みます。これが失敗した場合、代わりにAxisFaultを渡すだけです。

スタブはf.getDetail()の呼び出しを試みます。これがnullの場合、カスタム例外を作成しようとせず、AxisFaultを渡します。 Axis2 1.5では、サーバー側で自動生成されたMessageInOutReciverはデフォルトでこの値を設定しません。

次のようにサーバー側で手動で設定できます(MyFaultExceptionおよびMyFaultクラスを自動生成したと仮定):

        MyFaultException ex = new MyFaultException("My Exception Message");
        MyFault fault = new MyFault();
        fault.setMyFault("My Fault Message");
        ex.setFaultMessage(fault);
        throw ex; 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top