9

JAX-WS を使用して Web サービスを作成しています (Java から WSDL へのアプローチを使用してこれを作成しています)。

必要に応じて例外を機能させるのに問題があります。

次の例外クラスを作成しました。

@WebFault
public class MyWebServiceException extends SOAPFaultException {

    private static final long serialVersionUID = 8234753208722614057L;

    protected MyWebServiceException(SOAPFault fault) {
        super(fault); 
    }

    protected MyWebServiceException(SOAPFault fault, Throwable throwable) {
        this(fault);
        super.setStackTrace(throwable.getStackTrace());
    }
}

これにより、SOAP 応答に次の内容を含めることができます。

<faultcode>E0010</faultcode>
<faultstring>Invalid Report</faultstring>
<detail>
    <ns2:exception class="com.example.web.common.exceptions.MyWebServiceException" note="To disable this feature, set com.sun.xml.ws.fault.SOAPFaultBuilder.disableCaptureStackTrace system property to false" xmlns:ns2="http://jax-ws.dev.java.net/">
     <message>Invalid Report</message>
     <ns2:stackTrace>
     <ns2:frame class="com.example.web.common.exceptions.ExceptionHandler" file="ExceptionHandler.java" line="34" method="getWebException"/>

ただし、私の例外はSOAPFaultExceptionwhich extendsRuntimeExceptionであるため、WSDL に追加されていないため、サービスのユーザーがクライアント スタブを生成するときに、例外は含まれません。

この例外を作成して意図した出力(つまり、フォルトコードとフォルト文字列を含む)を提供する方法を知っている人はいますか?WSDLにも表示されます(チェックされた例外である必要があると思います)

私はすでに持っているものを思いつくために非常に高低を検索しました!

4

2 に答える 2

5

WebMethod が MyWebServiceException をスローすることを宣言すると、WSDL に表示されます。

しかし、SOAPFault コードをいじってはいけません。ビジネス例外を作成してスローすると、SOAP の内部をいじることなく、クライアントでエラー コードを取得できます。

Web メソッドは次のようになります。

@WebMethod
public String sayHello(@WebParam String name, @WebParam String thing)  throws MyException
{
    // TODO Auto-generated method stub
    if ("err".equals(name))
        throw new MyException("E0010","Report not found");
    return null;
}

あなたのビジネスの例外:

public class MyException extends Exception {

    private static final long serialVersionUID = -923394585528818428L;
    public MyException(String errorCode,String errorMessage)
    {
        this.errorCode = errorCode;
        this.errorMessage = errorMessage;
    }

    public String getErrorCode() {
        return errorCode;
    }
    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }
    public String getErrorMessage() {
        return errorMessage;
    }
    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }
    String errorCode;
    String errorMessage;

}

そして返される oneexception は次のようになります:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Server</faultcode>
         <faultstring>Fault occurred while processing.</faultstring>
         <detail>
            <ns1:MyException xmlns:ns1="http://ws/">
               <errorMessage xmlns:ns2="http://ws/">Report not found</errorMessage>
               <errorCode xmlns:ns2="http://ws/">E0010</errorCode>
            </ns1:MyException>
         </detail>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

スタック トレースを追加することもできますが、必要に応じてクライアント エラーと関連付ける GUID を使用して、サーバーにログインすることをお勧めします。

于 2013-03-25T11:04:07.973 に答える
1

JAX-RPC ではなく JAX-WS を使用していると仮定すると、extends SOAPFaultException. その後、必要なフィールドを独自の例外に追加します。

これは StackTraceElement です (例として):

    public class SOAPStackElement implements Serializable {
       private static final long serialVersionUID = 1L;

       @XmlAttribute(name="class")
       private String class;
       @XmlAttribute(name="file")
       private String file;
       @XmlAttribute(name="methodname")
       private String methodName;
       @XmlAttribute(name="line")
       private Integer line;
    }

これは SOAP 情報です。

    public class SOAPFaultInfo implements Serializable {
        @XmlElementWrapper(name="stackTrace")
        private SOAPStackElement[] stackTrace;
        @XmlElement(name="faultcode")
        private String faultCode;
        @XmlElement(name="faultstring")
        private String faultString;
        /* what else your heart desires.  :-) */
    }

そして、これは本当の例外です:

    @WebFault
    public class MyWebServiceException extends Exception {

       private static final long serialVersionUID = 1L;
       private SOAPFaultInfo faultInfo;

       protected MyWebServiceException(SOAPFaultInfo fault) {
          super(); 
          this.faultInfo = fault;
       }

       protected MyWebServiceException(SOAPFaultInfo fault, Throwable cause) {
          super(cause);
          this.faultInfo = fault;
       }

       public SOAPFaultInfo getFaultInfo() {
          return faultInfo;
       }
   }

正直なところ、これをテストプロジェクトに入れることはできませんでした。したがって、いくつかのコンパイルの問題を解決する必要があるかもしれません。しかし、私はあなたが写真を手に入れることを願っています。

于 2013-03-25T10:52:24.360 に答える