0

こことインターネットですでに検索しましたが、問題の解決策が見つかりませんでした。

カスタム例外ハンドラーを使用して、すべての Java 例外をインターセプトし、それらを特定の方法で処理したいと考えています (特定のステータスを応答に設定し、次に一般的な Ajax エラーで呼び出します。それらは処理され、JS ダイアログは次のようになります。特定のメッセージで作成されます)。

だから私は自分のアクションを作成しました:

public class DefaultExceptionHandlerAction extends ExceptionMappingInterceptor  {

/** The class logger. */
private static final Logger LOGGER = Logger.getLogger(DefaultExceptionHandlerAction.class);

@Override
protected void publishException(ActionInvocation invocation, ExceptionHolder exceptionHolder) {

    LOGGER.error("Global Exception msg: "+ exceptionHolder.getException().getMessage(), exceptionHolder.getException());

    String message = "error msg for client";

    HttpServletResponse response = ServletActionContext.getResponse();
    response.reset();
    response.setStatus(HttpServletResponse.SC_BAD_REQUEST);

    PrintWriter out = null;
    try {
        response.setCharacterEncoding("UTF-8");
        out = response.getWriter();
        out.print(message);
    } catch (IOException ioe) {
        LOGGER.error("IOException in printMessage : " + ioe.getMessage(), ioe);
    } finally {
        if (out != null) {
            out.flush();
            out.close();
        }
    }
}
}

これに加えて、私の struts.xml には次のものがあります。

 <interceptor name="exception" class="com.travelsoft.orchestra.b2b.configuration.DefaultExceptionHandlerAction" />

 <interceptor-stack name="securedStack">
   <interceptor-ref name="exception" />
   <interceptor-ref name="defaultStack" />
   <interceptor-ref name="i18n" />
   <interceptor-ref name="login" />
 </interceptor-stack>

<global-results>
  <result name="exception">/defaultExceptionHandler.action</result>
</global-results>

<global-exception-mappings>
  <exception-mapping exception="java.lang.Exception" result="exception" />
</global-exception-mappings>

ある特定のアクションでは、コード内で直接 null ポインター例外を強制しました。もちろん、このアクションはsecuredStackインターセプターを使用しています。

このアクションを実行すると、未定ループが発生します。

JavaScript:

  error : function(jqXHR, textStatus, errorThrown) {
     // all other errors
     var contentDialog = $("<div/>",{ "id":"contentDialog"});
     contentDialog.html(jqXHR.responseText);
     contentDialog.dialog({
           title : 'Erreur',
           modal : true,
           zIndex: 8888,
           resizable: false,
           close: function(event, ui) {
             $(this).dialog("destroy").remove();
           },
           buttons:{"OK": function() {
           $(this).dialog("close");}}
     });

 },...
4

1 に答える 1

1

すでに入っているのでdefaultStack exception Interceptor

<interceptor-stack name="defaultStack">
    <interceptor-ref name="exception"/>
    <interceptor-ref name="alias"/>
    <interceptor-ref name="servletConfig"/>
    <interceptor-ref name="i18n"/>
    <interceptor-ref name="prepare"/>
    <interceptor-ref name="chain"/>
    <interceptor-ref name="scopedModelDriven"/>
    <interceptor-ref name="modelDriven"/>
    <interceptor-ref name="fileUpload"/>
    <interceptor-ref name="checkbox"/>
    <interceptor-ref name="multiselect"/>
    <interceptor-ref name="staticParams"/>
    <interceptor-ref name="actionMappingParams"/>
    <interceptor-ref name="params">
        <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
    </interceptor-ref>
    <interceptor-ref name="conversionError"/>
    <interceptor-ref name="validation">
        <param name="excludeMethods">input,back,cancel,browse</param>
    </interceptor-ref>
    <interceptor-ref name="workflow">
        <param name="excludeMethods">input,back,cancel,browse</param>
    </interceptor-ref>
    <interceptor-ref name="debugging"/>
</interceptor-stack>

あなたは基本的に2つの例外 Interceptors、あなたが書いたものと元のものを含めています。彼らはおそらくお互いを台無しにしています。

構成内の最初の例外インターセプターを除いて、デフォルト スタックのインターセプターを手動で挿入して、スタックを作成してみてください。

 <interceptor-stack name="securedStack">
   <interceptor-ref name="exception" />
        <interceptor-ref name="alias"/>
        <interceptor-ref name="servletConfig"/>
        <interceptor-ref name="i18n"/>
        <interceptor-ref name="prepare"/>
        <interceptor-ref name="chain"/>
        <interceptor-ref name="scopedModelDriven"/>
        <interceptor-ref name="modelDriven"/>
        <interceptor-ref name="fileUpload"/>
        <interceptor-ref name="checkbox"/>
        <interceptor-ref name="multiselect"/>
        <interceptor-ref name="staticParams"/>
        <interceptor-ref name="actionMappingParams"/>
        <interceptor-ref name="params">
            <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
        </interceptor-ref>
        <interceptor-ref name="conversionError"/>
        <interceptor-ref name="validation">
            <param name="excludeMethods">input,back,cancel,browse</param>
        </interceptor-ref>
        <interceptor-ref name="workflow">
            <param name="excludeMethods">input,back,cancel,browse</param>
        </interceptor-ref>
        <interceptor-ref name="debugging"/>
   <interceptor-ref name="login" />
 </interceptor-stack>

注:i18n Interceptorも既に存在します...

于 2013-06-19T15:26:59.063 に答える