2009-08-24 9 views
4

Je suis en train de passer du code qui utilise les implémentations du contrôleur Spring MVC pour utiliser le stéréotype d'annotation @Controller. Tout se passe bien à l'exception d'un problème:Appelez par programme @Controller

Étant donné une demande/réponse, comment gérer par programme les demandes de contrôleurs basés sur des annotations?

Auparavant, (quelle que soit la mise en œuvre) j'ai pu appeler:

controller.handleRequest(request, response) 

Quel est l'équivalent avec annotations? J'avais supposé qu'il y aurait une certaine classe de services publics le long des lignes de (peut-être statique?):

SpringAnnotationBasedControllerUtils.handleRequest(<? extends @Controller> handlerObject, HttpServletRequest request, HttpServletResponse response); 

pour gérer les détails de mappage d'une demande aux signatures dynamiques autorisées par le stéréotype @Controller, mais je ne peux pas trouver une telle chose.

Des suggestions?

(S'il vous plaît aucun commentaire sur pourquoi c'est une mauvaise idée ou devrait être inutile avec un "bon" design, etc. Ce code est sous maintenance et doit être aussi non invasive que possible donc une réécriture complète n'est pas une option en ce moment.)

Merci!

Répondre

3

Vous appelez simplement la méthode sur l'objet. C'est l'un des grands avantages des contrôleurs pilotés par annotations, vous pouvez écrire uniquement les méthodes dont votre code a besoin sans avoir à plier les choses hors de forme pour se conformer aux interfaces. Il suffit donc de connecter votre bean contrôleur à votre code et d'appeler la méthode directement. Ou voulez-vous dire que vous voulez réinventer le mécanisme par lequel Spring mappe les requêtes sur les contrôleurs annotés? Si oui, jetez un oeil à la source pour les classes AnnotationMethodHandlerAdapter et DefaultAnnotationHandlerMapping de Spring. C'est complexe, bien que - les contrôleurs annotés facilitent l'écriture des contrôleurs, mais le mécanisme sous-jacent est désagréable.

+0

J'ai un HandlerInterceptor qui devra parfois appeler un petit sous-ensemble des contrôleurs manuellement, d'où la nécessité de réintroduire fondamentalement l'interface du contrôleur. Il semble que l'AnnotationMethodHandlerAdapter fera ce dont j'ai besoin! Je vous remercie! –

2

Spring a quelque chose appelé HandlerAdapter qui prend une requête et une implémentation de contrôleur et l'appelle. Cela permet aux contrôleurs d'autres frameworks d'être réutilisés au printemps. Vous voulez le AnnotationMethodHandlerAdapter. Je crois que vous pouvez instancier-vous ceci:

HandlerAdapter adapter = new AnnotationMethodHandlerAdapter(); 
ModelAndView modelAndView = adapter.handle(request, response, controller); 

Je l'ai fait moi-même quelque chose de semblable - mais je ne suis pas sûr que je ne quitterai pas quelque chose essentielle.

0

Vous pourriez introduire votre propre interface pour permettre ce genre de comportement de poignée générique facilement - compte tenu de la réécriture cependant - que voulez-vous faire par programmation? par exemple. quel type d'arbre de décision - les mappages de paramètres intégrés sont assez flexibles.