2013-06-19 3 views
0

Я уже искал здесь и в Интернете, но не смог найти решение проблемы.Struts2 customExceptionMappingInterceptor

Я хотел бы использовать свой собственный обработчик исключений, чтобы перехватить все исключения 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> 

В одном конкретном действии, я вынужден исключения нулевого указателя непосредственно в коде. Конечно, это действие использует перехватчик 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");}} 
    }); 

},... 
+0

undertermined является опечатка для untermined (бесконечная)? –

ответ

1

С defaultStackalready contains 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> 

, вы в основном в том числе два исключения перехватчики, одного написанного вами и оригинал; они, вероятно, испортили друг друга;

пытаются составить свой стек вручную вставив перехватчики по умолчанию стека, кроме первого исключения перехватчик в конфигурации:

<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 уже присутствует слишком ...

+0

Спасибо, что все исключения java хорошо пойманы этим перехватчиком, а мой js, который вызвал действие через ajax, вводит ошибку: часть, которая покажет сообщение пользователю. Один вопрос: если ошибка возникает в шаблоне freemarker, я также войду в этот перехватчик, но строка response.reset(); выкинет исключение: java.lang.IllegalStateException вы знаете, почему это происходит? – gospodin

+0

Нет ... никогда не использовал Freemarker, но я не понимаю, что «ошибка возникает в шаблоне freemarker» означает:/Но поскольку это совершенно другая пара обуви, я предлагаю вам открыть новый вопрос с тегом freemarker получить помощь от правильной цели;) –

Смежные вопросы