1

EJB Web サービスがあります。Web サービス メソッドによってスローされるカスタム フォールト クラスを作成しましたが、これはうまく機能します。私のクライアントは、これらのカスタム例外をキャッチし、適切に処理します。私が遭遇した問題は、Bean のコンストラクターで例外が発生し、カスタム例外をスローした場合、クライアントがカスタム例外を受信せず、次を受信することです。

javax.xml.ws.soap.SOAPFaultException: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB
at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:178)
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:111)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:108)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
at $Proxy34.getLots(Unknown Source)

私の質問は、EJB のコンストラクターでカスタム例外をスローして、クライアントから受け取ることはできますか? もしそうなら、私は何を間違っていますか。

私のコード:

EJB コンストラクター

public LotManagement() throws LotManagementException
{
    try {
        pm = new PromisManager();
    } catch (UnknownHostException ex) {
        java.util.logging.Logger.getLogger(LotManagement.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        FaultBean LotManagementFaultBean = new FaultBean();
        throw new LotManagementException(ex.getMessage() + "\n\n" + propMan.getProperty("ContactMessage"), LotManagementFaultBean, ex.getCause());
    }
}

障害ビーン

package com.onsemi.cim.exception;
import javax.xml.ws.WebFault;

@WebFault(name="LotManagementException")

public class LotManagementException extends Exception {

private static final long serialVersionUID = 1L;

private FaultBean faultBean;

public LotManagementException() {
    super();
}

public LotManagementException(String message, FaultBean faultBean,
        Throwable cause) {
    super(message, cause);
    this.faultBean = faultBean;
}

public LotManagementException(String message, FaultBean faultBean) {
    super(message);
    this.faultBean = faultBean;
}

public FaultBean getFaultInfo() {
    return faultBean;
}

}
4

2 に答える 2

0

考えられる解決策は、コンストラクター内で例外をキャッチし、そこですべての例外を処理することです。例外をスローするか、ステータス 0/1 などのカスタム エラー メッセージを送信し、応答コードに基づいてクライアントがそれに応じて動作するかどうかを決定できることをクライアントと合意します。

また、カスタム例外をスローせずにエラー メッセージを送信することをお勧めします。将来、何らかの理由でカスタム エラー メカニズムを置き換える必要がある場合は、それに応じてクライアントにいくつかの変更を行うよう依頼する必要があるためです。

于 2013-10-11T05:34:40.147 に答える
-1

実際、コンストラクターから例外をスローすることはお勧めできません。なぜなら、異なる API (Spring など) では例外の扱いが異なるためです。EJB コンストラクターから例外を取得すると、CreateException がスローされるため、このエラーが発生します。したがって、私の意見は、コンストラクターから例外を確認し、可能な限り削除することです。

于 2013-10-11T05:13:34.440 に答える