2009-06-10 7 views
8

J'ai essayé de trouver la réponse à cette question à la fois sur le forum de Spring et en cherchant StackOverflow. J'ai trouvé beaucoup de pages décrivant des architectures horribles et demandant à peu près la même chose que moi, mais mon utilisation est différente, alors s'il vous plaît :-)Accéder à HttpServletRequest à partir du conseil AOP au printemps 2.5 avec les annotations

J'ai un projet Spring 2.5 utilisant des contrôleurs de formulaires basés sur des annotations essentiellement comme ceci:

@RequestMapping("/edit/someObject") 
public String handleSubmit(HttpServletRequest request, HttpServletResponse response, SomeObject someObject, BindingResult result) { 

    // Some check here 

    if(result.hasErrors()) { 
     return "form"; 
    } else { 
     SomeObjectService.update(someObject); 
     return "redirect:/view/someObject"; 
    } 
} 

dans ce que je vérifie pour une propriété http dans le HttpServletRequest et utiliser le HttpServletResponse d'envoyer une redirection si cette propriété a une certaine valeur. Cette vérification est faite beaucoup (mais pas tous) des contrôleurs de formulaire dans cette application. Ce que je voudrais faire est de créer une annotation @CheckedSubmit traitée par un conseil AOP pour faire cette vérification, puis de supprimer les paramètres HttpServletRequest et HttpServletResponse du contrôleur. Mon problème est que je n'ai aucune idée comment accéder aux HttpServletRequest et HttpServletResponse courants de ce conseil AOP sans utiliser ces deux paramètres (inutilisés) à la méthode annotée, ce que j'ai essayé d'éviter en premier lieu.

Résumé: Comment accéder à la méthode HttpServletRequest/Response from AOP sur une méthode annotée @RequestMapping?

Répondre

12

Deux solutions pour le résumé, mais pas pour votre problème dans son ensemble (complètement)

Solution 1: à l'intérieur des conseils (> = Spring 2.0 requis)

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder 
     .getRequestAttributes()).getRequest(); 

Solution 2: à l'intérieur de la classe d'aspect (probablement Spring 3.0 à l'intérieur des grains de singelton requis!)

@Autowired(required=true) 
private HttpServletRequest request; 
+0

Avec la remarque ajoutée que la solution 2 fonctionne pour les objets non instanciés par Spring lorsque @Configurable est utilisé (nécessite AspectJ) – Tomas

3

Je pense que vous le savez probablement déjà, mais le "officiel" était de le faire dans Spring MVS est d'utiliser HandlerInterceptors. Ils ne sont pas pilotés par des annotations, mais ils sont insérés dans le flux de contrôle HTTP et obtiennent un accès complet à la requête et à la réponse.

+0

Oui, je sais cela. Mon problème est que cela devrait être légèrement configurable par méthode. Les annotations seraient idéales pour cela car elles permettent un traitement très simple de ce paramètre supplémentaire. – Tomas

+0

Oui, je peux voir que ce serait restrictif. Une autre option pourrait être d'écrire votre propre implémentation de HandlerAdapter, peut-être en sous-classant AnnotationMethodHandlerAdapter. Je n'ai jamais fait cela moi-même, mais cela peut vous donner la flexibilité de faire ce dont vous avez besoin. – skaffman

Questions connexes