2

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

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

次に、Axis2 ant タスクを使用して WSDL を生成しました。WSDL を使用してクライアント スタブを生成し、サービスをテストします。生成されたコードには、「MyExceptionException」とスタブ内の「myMethod」が含まれており、これをスローするように宣言されています。

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

ただし、catch で囲まれたメソッドを呼び出すと、代わりに AxisFault を送信するサーバー (RemoteException のサブクラス) によって「MyExceptionException」が送信されることはありません。

問題はサーバー側にあると思いますが、どこにあるのかわかりません。このサービスは、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 がカスタム <wsdl:fault> を生成し、WSDL2Java が例外クラス (スタブメソッドでスローするように宣言します)これが使用できない場合...

4

3 に答える 3

4

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

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

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

于 2008-10-10T17:26:46.157 に答える
1

Lady4j で Axis2 を使用してみましたか。この問題は解決しました。

于 2009-11-19T09:46:25.717 に答える
1

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; 
于 2010-05-27T09:35:13.213 に答える