web-dev-qa-db-fra.com

Lier des variables de chemin à un objet de modèle personnalisé au printemps

J'ai une classe qui modélise ma demande, quelque chose comme

class Venue {
    private String city;
    private String place;

    // Respective getters and setters.
}

Et je veux prendre en charge une URL RESTful pour obtenir des informations sur un lieu. J'ai donc une méthode de contrôleur comme celle-ci.

@RequestMapping(value = "/venue/{city}/{place}", method = "GET")
public String getVenueDetails(@PathVariable("city") String city, @PathVariable("place") String place, Model model) {
    // code
}

Existe-t-il un moyen, je peux dire au printemps, de lier mes variables de chemin à l'objet modèle (dans ce cas, Venue) au lieu d'obtenir chaque paramètre individuel?

29
Senthil Babu

Spring MVC offre la possibilité de lier les paramètres de requête et les variables de chemin dans un JavaBean, qui dans votre cas est Venue. Par exemple:

@RequestMapping(value = "/venue/{city}/{place}", method = "GET")
public String getVenueDetails(Venue venue, Model model) {
    // venue object will be automatically populated with city and place
}

Notez que votre JavaBean doit avoir les propriétés city et place pour qu'il fonctionne.

Pour plus d'informations, vous pouvez consulter l'exemple withParamGroup () de spring-projects/spring-mvc-showcase

30
Liang Zhou

Vous pouvez fournir une implémentation de l'interface HandlerMethodArgumentResolver. Cette interface est principalement utilisée pour résoudre les arguments de vos méthodes de contrôleur d'une manière que Spring ne peut pas (ce qui est essentiellement ce que vous essayez de faire). Pour ce faire, vous implémentez ces deux méthodes:

public boolean supportsParameter(MethodParameter mp) {
    ...
}

public Object resolveArgument(mp, mavc, nwr, wdbf) throws Exception {
    ...
}

Vous pouvez injecter votre implémentation dans le contexte Spring via:

<mvc:annotation-driven>
    <mvc:argument-resolvers>
        <bean class="com.path.ImplementationOfHandlerMethodArgumentResolver"/>
    </mvc:argument-resolvers>
</mvc:annotation-driven>

Lorsque Spring rencontre un paramètre qu'il ne peut pas résoudre, il appellera votre méthode supportsParameter() pour voir si votre résolveur peut résoudre le paramètre. Si votre méthode retourne true, Spring appellera votre méthode resolveArgument() pour réellement résoudre le paramètre. Dans cette méthode, vous avez accès à l'objet NativeWebRequest, que vous pouvez utiliser pour récupérer le chemin au-delà du contextPath. (dans votre cas, ce serait: /venue/{city}/{place}), vous pouvez analyser le chemin de demande et essayer d'obtenir les chaînes de ville/lieu à remplir dans votre objet de lieu.

3
Paul Gray

Selon la documentation Spring disponible sur http://static.springsource.org/spring/docs/3.2.3.RELEASE/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri -templates , la prise en charge automatique est fournie aux types simples uniquement:

Un argument @PathVariable peut être de n'importe quel type simple tel que int, long, Date, etc. Spring se convertit automatiquement au type approprié ou lève une exception TypeMismatchException s'il ne le fait pas.

Je n'ai pas essayé cette combinaison spécifique de @RequestParam et Model, mais il semble que vous puissiez obtenir l'implémentation souhaitée en créant un WebBindingInitializer personnalisé, comme détaillé dans http://static.springsource.org/spring/ docs/3.2.3.RELEASE/spring-framework-reference/html/mvc.html # mvc-ann-typeconversion .

La classe personnalisée aura accès à WebRequest et retournera un objet de domaine rempli avec des données extraites de cette demande.

3
vincentks