2011-07-08 2 views
2

Spring MVC permet de définir handler methods with a variety of parameters qui sont remplis avec les valeurs appropriées.Spring MVC et méthodes gestionnaire avec POJOs

Est-il possible d'utiliser la même approche pour remplir les valeurs dans un POJO qui est ensuite passé à une méthode de gestionnaire?

Actuellement, je dois faire:

@RequestMapping 
public ModelMap handle(@RequestParam("user") String user, ...) 

Ce que je voudrais faire:

class HandlerPojo { 
    @RequestParam("user") String user; 
    ... 
} 

@RequestMapping 
public ModelMap handle(HandlerPojo pojo) 

Répondre

2

Il est en fait assez simple, même sans ressort @RequestParam annotations à l'intérieur POJO. Ce que vous cherchez est une coutume WebArgumentResolver. Voici un exemple complet:

@Service 
public class UserArgumentResolver implements WebArgumentResolver { 
    @Override 
    public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception { 
     if (methodParameter.getParameterType() == User.class) { 
      return new User(webRequest.getParameter("user")); 
     } 
     return WebArgumentResolver.UNRESOLVED; 
    } 
} 
code

est plutôt explicite: si l'un des paramètres du gestionnaire est de type User, récupérer paramètre de requête nommé user et retournez tout ce que vous voulez (bien sûr, il doit être cessible à User .. WebArgumentResolver.UNRESOLVED signifie que le résolveur était incapable de gérer ce paramètre et résolveurs devait être examinée

Malheureusement résolveur ne sont pas repris par défaut, il doit être enregistré:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="customArgumentResolver" ref="userArgumentResolver"/> 
</bean> 

<mvc:annotation-driven /> 

Ca y est! Votre gestionnaire peut ressembler à ceci:

@RequestMapping 
public void handle(User user) { 
    //... 
} 
0

Ce n'est pas possible, le @RequestMapping tire les paramètres spécifiés dans la demande et l'attribution leurs valeurs à une variable java. Vous ne pouvez pas passer un pojo dans une requête, car le pojo n'existe pas sur le client. Peut-être regarder passer un certain json de retour et de le désérialiser dans un pojo en utilisant jackson ou gson.

+0

-1: Pas vrai, Spring va se lier à un POJO, sur la base des noms des propriétés de haricots POJO. Voir la réponse de @ JB. – skaffman

4

La documentation vous dit lié à:

méthodes gestionnaire qui annotés avec @RequestMapping peuvent avoir très signatures flexibles. [...]

  • commande ou objets de formulaire pour lier des paramètres à: comme propriétés de haricots ou des champs, avec conversion de type personnalisable [...]

Vous ne pouvez pas utiliser l'annotation @RequestMapping sur les propriétés/champs du POJO comme vous avez fait dans votre exemple, mais si les noms de propriétés de la carte POJO les noms de paramètres, le POJO seront instanciés et peuplé au printemps correctement.

+0

+1 J'aime vraiment votre réponse, mais depuis que je tendance à avoir des problèmes plus complexes que l'utilisateur moyen, je pense que la réponse Tomasz sera légèrement plus utile à long terme. –