Axis2 Javaを使用してWebサービスが例外をスローする
-
08-07-2019 - |
質問
実際には、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;