2009-08-12 8 views
3

Je développe une application Web et j'utilise Spring framework. En fait, je n'ai jamais vraiment appris à utiliser Spring et je suis un peu perdu dans tout ça. Cependant, en utilisant les contrôleurs basés sur les annotations, j'ai été capable de créer la plupart de mon application!Intercepter des requêtes avant qu'elles ne parviennent au contrôleur dans une application web Spring basée sur des annotations

Maintenant, le problème est que je devrais être capable d'intercepter les requêtes avant qu'elles ne soient envoyées aux contrôleurs (j'en ai besoin pour que je puisse valider que l'utilisateur a accès à la page qu'il demande). Je viens de passer environ 5 heures à chercher des informations à ce sujet et j'ai en fait trouvé beaucoup, aucun d'entre eux n'a fonctionné comme prévu, je n'ai jamais été capable de rendre mon intercepteur afficher un simple "Hello World".

Voici ce que j'ai dans mon * -servlet.xml (j'ai aussi la définition d'autres haricots bien sûr):

<!-- this should be the class that contains the "hello world" --> 
<bean id="myInterceptor" class="com.ibm.brmt.srb.admin.web.controller.TimeBasedAccessInterceptor"/> 

<!-- this should "map" my interceptor no? --> 
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="interceptors"> 
     <list> 
      <ref bean="myInterceptor"/> 
     </list> 
    </property> 
</bean> 

et voici ma classe TimeBasedAccessInterceptor (le nom n'est pas pertinent et probablement être changé)

package web.controller; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 



public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter{ 

    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { 
     System.out.println("-------------------------------------------------------------------------------------------");  
     } 

    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { 
     System.out.println("-------------------------------------------------------------------------------------------");  
     } 

    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { 
     System.out.println("-------------------------------------------------------------------------------------------");  
     return false; 
    } 
} 

les codes compiler et exécuter, mais ce qui est dans la classe TimeBasedAccessInterceptor est jamais appelé (i même des points d'arrêt utilisés). Est-ce que quelqu'un peut m'aider?

comme demandé, voici un "aperçu" de la façon dont j'implémente le contrôleur dans le * -servlet.xml

<bean id="controllerName" class="web.controller.controllerNameController"> 
    <property name="property1" ref="beanRef" /> 
    <property name="property1" ref="beanRef2"/> 
</bean> 

et dans le controllerNameController.java:

package web.controller; 

    @Controller 
    public class controllerNameController{ 

     @RequestMapping 
     public void find(String[] enabledLvlCodes, String reset, String readRuleId, Filter filter, Errors errors, 
       Model model, HttpSession session) { 

     //Code goes here 
     } 
} 
+0

Cela devrait fonctionner. Pouvez-vous mettre à jour votre réponse pour montrer votre classe de contrôleur, et comment vous le déclarez au printemps? – skaffman

+0

Votre @RequestMapping ne spécifie pas de chemin URI. Êtes-vous sûr que la demande parvient à votre contrôleur? – skaffman

+0

oui, j'en suis sûr. Spring est capable de "créer" automatiquement l'uri à partir du nom de la méthode. Si la demande n'atteignait pas le contrôleur, je ne pouvais pas voir la page de retour que je vois! – Gadgetsan

Répondre

1

Votre cartographie semble correct.

Peut-être avez-vous défini d'autres mappages de gestionnaires en plus de DefaultAnnotationHandlerMapping (ce qui permettrait à votre contrôleur d'être invoqué via un chemin différent)?

Ou peut-être votre fichier de contexte n'a pas été déployé correctement (oui, c'est une suggestion stupide mais vous seriez surpris de voir combien de fois cela arrive :-))

Il la réponse aux deux questions est « NON », je d vous suggérons de mettre un point d'arrêt dans AbstractHandlerMapping.getHandler() et de passer au point où HandlerExecutionChain est obtenu et vérifiez s'il contient votre intercepteur.

+0

serait: \t cause du problème? – Gadgetsan

+1

absolument.Comme skaffman mentionné dans son commentaire, ne pas avoir URI spécifié dans @RequestMapping rend effectivement votre mappage d'annotation inutile, causant fallback à ControllerClassNameHandlerMapping – ChssPly76

+0

vous avez raison, après avoir supprimé le ControllerClassNameHandlerMapping et spécifier dans l'URI dans le contrôleur, il est allé dans l'intercepteur, Merci beaucoup, les gars sont incroyables – Gadgetsan

Questions connexes