La manipulation ambigu méthodes de gestionnaire d'mappé dans le RESTE de l'application avec le Printemps
J'ai essayé d'utiliser un code comme ci-dessous:
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Brand getBrand(@PathVariable Integer id) {
return brandService.getOne(id);
}
@RequestMapping(value = "/{name}", method = RequestMethod.GET)
public List<Brand> getBrand(@PathVariable String name) {
return brandService.getSome(name);
}
Mais je suis d'erreur, comment puis-je faire?
java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path 'http://localhost:8080/api/brand/1': {public java.util.List com.zangland.controller.BrandController.getBrand(java.lang.String), public com.zangland.entity.Brand com.zangland.controller.BrandController.getBrand(java.lang.Integer)}
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:375) ~[spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
OriginalL'auteur mikezang | 2016-02-02
Vous devez vous connecter pour publier un commentaire.
Printemps ne peut pas distinguer si la demande
GET http://localhost:8080/api/brand/1
seront traitées pargetBrand(Integer)
ou pargetBrand(String)
parce que votre cartographie est ambigu.Essayez d'utiliser un paramètre de requête pour la
getBrand(String)
méthode. Il semble plus approprié, puisque vous êtes l'exécution d'une requête:À l'aide de la méthode décrite ci-dessus:
GET http://localhost:8080/api/brand/1
seront traitées pargetBrand(Integer)
.GET http://localhost:8080/api/brand?name=nike
seront traitées pargetBrand(String)
.Juste un soupçon
Comme une bonne pratique de toujours utiliser le pluriel des noms pour vos ressources. Au lieu de
/brand
, utilisez/brands
.OriginalL'auteur cassiomolin
Lorsque vous exécutez l'application, et d'accéder aux points de terminaison-vous essayé le codage de vous réaliser la suivante, ' http://localhost:8086/brand/1 " et " http://localhost:8086/brand/FooBar " correspondent à la même URL, format (qui peut être décrit comme protocole de+de point de terminaison+'de marque'+). Donc SpringBoot est essentiellement confus si elle doit appeler la fonction 'getBrand' avec un type de données Chaîne ou un Entier. Donc, pour obtenir plus de cela, je vous suggère d'utiliser un paramètre de requête tel que mentionné par @cassiomolin ou ont des chemins séparés pour les deux appels. Cela peut être contre le RESTE principes, mais en supposant que vous êtes juste de faire un exemple d'application c'est une autre solution de contournement.
Cela a fonctionné pour moi.
OriginalL'auteur sandeep srivastav vaddiparthy