2011-05-13 5 views
3

Je construis un api de repos pour une webapp et j'ai rencontré un problème avec RequestMapping.Spring MVC RequestMapping correspond à une mauvaise URL

Fondamentalement, il existe des utilisateurs, qui sont regroupés dans différents domaines. Quand ils travaillent avec le système, certaines informations sont stockées dans un objet appelé «session» et écrites dans DB.

J'ai les URL suivantes:

1) http://server.com/api/v1/domain/ domainName/sessions - affiche des informations sur toutes les sessions pour tous les utilisateurs d'un domaine.

2) http://server.com/api/v1/domain/ domainName/user/userName/sessions - afficher des informations sur les sessions d'utilisateur particulier.

J'utilise le printemps 3.0.5 et déclaré 2 gestionnaires dans ma classe de contrôleur:

@RequestMapping(value = "/{domainId}/sessions", method=RequestMethod.GET) 
public void findSessions(@PathVariable final String domainId) { 
    ... 
} 

@RequestMapping(value = "/{domainId}/user/{username}/sessions", method=RequestMethod.GET) 
public void findUserSessions(
     @PathVariable final String domainId, 
     @PathVariable final String username) { 
    ... 
} 

J'utilise des contrôleurs mixtes applications: SimpleUrlHandlerMapping + Annotations

chemin de base pour le contrôleur est spécifié en utilisant SimpleUrlHandlerMapping:

<property name="mappings"> 
    <value> 
    /api/v1/domain/** = api.DomainsController 
    </value> 
</property> 

le problème est que les deux URL sont traitées par la première méthode. Pour l'URL 2, le nom d'utilisateur est lié à domainId pathvariable, donc la logique de la méthode de freinage. Mais, si je spécifie le chemin complet dans le mappage des requêtes, cela fonctionne correctement.

@RequestMapping(value = "/api/v1/domain/{domainId}/sessions", method=RequestMethod.GET) 
@RequestMapping(value = "/api/v1/domain/{domainId}/user/{username}/sessions", method=RequestMethod.GET) 

Répondre

1

Je pense qu'il serait préférable de ne pas mélanger les méthodes SimpleUriHandlerMapping et RequestMapping. Je ne pense pas qu'ils sont destinés à travailler ensemble.

Je pense que ce que vous voulez, c'est juste un RequestMapping de niveau classe pour le/api/v1/domaine et ensuite des mappages au niveau de la méthode pour les cas individuels.

Ainsi, en d'autres termes, supprimez l'entrée SimpleUrlHandlerMapping et faire à la place:

@Controller 
@RequestMapping(value = "/api/v1/domain") 
public class DomainsController { 

@RequestMapping(value = "/{domainId}/sessions", method=RequestMethod.GET) 
public void findSessions(@PathVariable final String domainId) { 
    ... 
} 

@RequestMapping(value = "/{domainId}/user/{username}/sessions", method=RequestMethod.GET) 
public void findUserSessions(
     @PathVariable final String domainId, 
     @PathVariable final String username) { 
    ... 
} 

} 

Cela indique Spring ce contrôleur est responsable de toutes les demandes commençant par/api/v1/domaine, puis la demande de niveau de la méthode les mappages sont relatifs à cela.

+1

Eh bien, ce n'était pas aussi simple que de supprimer l'entrée SimpleUrlHandlerMapping et d'ajouter @RequestMapping, mais après quelques recherches sur internet j'ai enfin réussi à les divorcer. (Je ne peux pas abandonner totalement SUHM parce qu'il y a d'autres contrôleurs 'legacy'). Cela fonctionne correctement maintenant avec DefaultAnnotationHandlerMapping – dvd

+0

HI, Pourriez-vous s'il vous plaît me dire l'utilisation de {} accolades dans l'URL RequestMapping. –

+1

@AravindRPillai ils sont utilisés pour spécifier des variables de chemin. – Willa

Questions connexes