2010-11-16 35 views
1

J'ai donc une application Struts2 sur laquelle je travaille. Sur ma page d'accueil, j'ai une section qui affiche toutes les exceptions que mon application lance. Cela a bien fonctionné jusqu'à ce que j'ajoute un Interceptor personnalisé.Struts2 L'application cache mes exceptions après l'ajout d'Interceptor

Voici mon code Interceptor:

public String intercept(ActionInvocation actionInvocation) throws Exception { 

    String result = actionInvocation.invoke(); 

    return result; 
} 

Voici le code dans ma classe d'action où l'exception est généré, il se produit où AuthService.Authorize() est appelée:

if(AuthService.Authorize(username, password)) { 
     if(AuthService.AdminAuthorized()) { 
      return "admin"; 
     } 
     return SUCCESS; 
    } 

Cette est à l'intérieur de AuthService.Authorize(), il déclenche une exception de point nul lorsque acc est accédé:

try { 
      acc = profileRepository.WhereSingle("Username", "=", username); 
     } catch (Exception e) { 
      return false; 
     } 

     if (acc.Password.equals(password)) { 

Cependant, lorsque la page est chargée. Ce n'est pas remplie:

<s:property value="%{exception.message}"/> 

Je l'ai testé et cela fonctionnerait si je jetais simplement une exception de la classe d'action. Je ne demande pas un redirectAction ou quoi que ce soit

Voici le haut de ma définition de package par défaut qui tous mes autres paquets s'étendent

<package name="default" namespace="/" extends="struts-default"> 

    <!-- Interceptors --> 
    <interceptors> 
     <interceptor name="conversation" class="global.ConversationInterceptor"/> 
     <interceptor-stack name="dils-stack"> 
      <interceptor-ref name="defaultStack"/> 
      <interceptor-ref name="conversation"/>     
     </interceptor-stack> 
    </interceptors> 

    <default-interceptor-ref name="dils-stack"/> 

    <global-results> 
     <result name="Exception" >/index.jsp</result> 
    </global-results> 

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

Répondre

1

Comment votre pile d'intercepteurs défini pour cette action? Le ExceptionMappingInterceptor doit être défini en premier dans la pile. Pouvez-vous publier la configuration de la pile d'intercepteurs à partir de votre fichier struts.xml? Votre intercepteur personnalisé ne devrait pas interférer (il ne fait rien).

Mise à jour:

j'ai pu reproduire ce problème, mais il se produit pour moi avec ou sans votre intercepteur personnalisé.

La raison en est que vous recherchez spécifiquement le message d'exception, qui n'est pas défini pour NullPointerException s qui sont lancés automatiquement (comme dans votre cas). Vous pouvez le confirmer en affichant à la place la trace de pile, par exemple: %{exceptionStack}

%{exception.message} est null pour le NullPointerException, et donc il n'affiche rien. Si à la place vous deviez lancer une exception avec un message (par exemple, throw new RuntimeException("OMG!");), le message s'affichera. Notez également que vous devez spécifier des mappages d'exceptions plus spécifiques avant des mappages moins spécifiques dans struts.xml. Parce que NullPointerException est plus spécifique que Exception, vous devez l'énumérer en premier. Notez que cela n'a pas vraiment d'importance dans votre exemple, car ils correspondent à la même chose. Sachez simplement que votre NPE sera mappé à la première entrée, pas à la seconde.

+0

voir ci-dessus, merci. – WSkinner

+0

Confirmé avec Struts 2.2.1 sur Tomcat 6.x. –