Question

Ceci est l'exemple de code à partir du printemps 3.1

Était-ce utile?

La solution

Pour ajouter @ la réponse de GaryF et de clarifier certains points, Spring 2.5 introduit Controllers annotés, qui a remplacé les anciens contrôleurs de style d'interface de Spring 2.0. Ces nouveaux contrôleurs ont des méthodes sans paramètres fixes -. La méthode déclare les paramètres dont il a besoin pour faire son travail, et rien de plus

Par exemple, dire une méthode de commande nécessaire une chose à faire son travail - un paramètre de requête qui contient l'ID d'un objet à partir de la base de données. Au printemps 2.0, vous devez mettre en œuvre quelque chose comme AbstractController.handleRequestInternal(), par exemple

protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) {
   String id = request.getParameter("id");
   MyThing obj = getObjById(id);
   //... do stuff and return ModelAndView
}

Spring 2.5 fait que plus facile:

@RequestMapping
public ModelAndView handle(String id) {
   MyThing obj = getObjById(id);
   //... do stuff and return ModelAndView
}

Ici, nous déclarons que les paramètres pour les choses dont nous avons besoin.

Jusqu'à présent, si bon, mais c'est là un WebArgumentResolver personnalisé entre en jeu. Disons que je veux retirer le getObjById de mon contrôleur tout à fait, parce que je pense peut-être qu'il encombre le code, et peut-être il est utilisé dans de nombreuses autres méthodes de contrôleur. Je veux plutôt faire ceci:

@RequestMapping
public ModelAndView handle(MyThing id) {
   //... do stuff and return ModelAndView
}

Il est encore plus simple, et dispose d'un minimum de code passe-partout. Un WebArgumentResolver personnalisé peut être enregistré auprès de l'app-contexte qui reconnaît les paramètres de type MyThing et sait comment extraire les informations de la demande. Spring invoque que résolveur, et transmet le résultat à la méthode du contrôleur.

résolveurs personnalisés ne sont pas couramment utilisés, mais peut être très pratique dans la bonne situation.

L'exemple de votre question utilise CustomArgumentResolver pour résoudre la classe RequestAttribute personnalisée de l'exemple. Le résolveur sort des attributs de requête et les lie à des objets RequestAttribute, de sorte qu'ils puissent être déclarés comme paramètres de la méthode de l'automate.

Autres conseils

WebArgumentResolvers sont un moyen pour vous de spécifier comment les paramètres des méthodes mappées MVC doivent être résolus. Si vous souhaitez utiliser un objet personnalisé en tant que paramètre pour une méthode mappée MVC, Spring essaie de comprendre comment du sens de celui-ci dans sa façon de lui. Typiquement, cela se passerait-il par la liaison, où certains paramètres http vous soumettez correspondent aux champs de l'objet et le printemps les allumettes et crée un nouvel objet pour vous.

Si jamais vous avez une situation où les paramètres soumis ne correspondent pas tout à fait aussi parfaitement avec vos paramètres de la méthode, WebArgumentResolvers sont là pour combler le vide: vous fournir une logique personnalisée afin printemps ne pas le comprendre.

Dans votre exemple, est l'un param tel paramètre d'être jumelés. Ce morceau de code personnalisé vérifie d'abord si le paramètre a une annotation @RequestAttribute. Dans le cas contraire, le code personnalisé tire la valeur de cet objet et il semble comme un attribut sur la requête http, le retourner. Il ne dispose pas de cette annotation, la méthode renvoie la valeur SUSPENS, qui indique simplement que cette WebArgumentResolver ne sait rien sur ce paramètre particulier et le printemps devrait essayer une autre méthode (comme la liaison).

scroll top