37 votes

Spring Web MVC: utilisez le même mappage de requête pour le paramètre de requête et la variable de chemin

Bonnes gens:

est-il un moyen d'exprimer ma Web Spring MVC méthode de contrôleur doit être compensée soit par une demande de remise en ID, comme une partie du chemin de l'URI ...

@RequestMapping(method=RequestMethod.GET, value="campaigns/{id}")
public String getCampaignDetails(Model model, @PathVariable("id") Long id) {

... ou si le client envoie en l'IDENTIFIANT comme un paramètre de la requête HTTP dans le style ...

@RequestMapping(method=RequestMethod.GET, value="campaigns")
public String getCampaignDetails(Model model, @RequestParam("id") Long id) {

Cela me semble tout à fait commun dans le monde réel schéma d'URL où je ne veux pas ajouter de code en double, mais je n'étais pas en mesure de trouver encore de réponse. Des conseils très bienvenue.

EDIT: Il s'avère qu'il n'y paraît actuellement (avec Spring MVC <= 3.0) aucun moyen pour atteindre cet objectif, voir la discussion à l'intérieur de Javi réponse.

50voto

Javi Points 5678

Vous pouvez définir à la fois le mappage d'url pour la même fonction et le réglage de l'id comme facultatif.

@RequestMapping(method=RequestMethod.GET, value={"/campaigns","/campaigns/{id}"})
public String getCampaignDetails(Model model,
     @RequestParam(value="id", required=false) Long id,
     @PathVariable("id") Long id2)
{
}

si c'était une carte ainsi lorsque l'id n'est pas envoyé, mais vous pouvez contrôler ce à l'intérieur de la méthode.

EDIT: La solution précédente ne fonctionne pas, car @PathVariable n'est pas défini à l' null lorsqu'il n'y a pas d' {null} et il est impossible de mapper l'URL (merci ngeek). Je pense donc que la seule solution possible est de créer deux méthodes de chacun mappé avec ses @MappingRequest et à l'intérieur de l'un d'entre eux appellent d'autres fonctions ou de les rediriger vers l'autre URL (redirection: ou avant: Printemps préfixes). Je sais que cette solution n'est pas ce que vous cherchez, mais pense que c'est le meilleur que vous pouvez faire. En effet, vous n'êtes pas la duplication de code, mais vous êtes en train de créer une autre fonction pour gérer une autre URL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X