Ambigu méthodes de gestionnaire pour http chemin?
J'ai un traitement au Printemps où j'ai déclaré ma classe comme ceci:
@Controller
@RequestMapping(value = "/rest/api/datasources/", produces = MediaType.APPLICATION_JSON_VALUE, method=RequestMethod.GET)
public class MetadataServiceController {
//Two separate methods:
@RequestMapping(value="{datasourceName}")
public Object getLatestApiMetadata(@PathVariable String datasource,
@RequestParam (required = false) String datasourceNum,
@RequestParam (defaultValue = "true") String dataFields,
@RequestParam ( required=false, defaultValue = "api") String visibility){
... //Implementation here
}
@RequestMapping(value="{apiVersion}")
public @ResponseBody List<DataSource> getAllMetadata(
@RequestHeader(value="sub-version", required=false, defaultValue="0.0") String minorVer,
@PathVariable String restApiVersion,
@RequestParam(required = false) String datasourceNum,
@RequestParam(defaultValue = "all") String visibility)
throws ObjectNotFoundException {
... //Implementation here
}
}
Mais quand j'essaie d'atteindre l'un de ces repos des points de terminaison, j'obtiens un message d'erreur disant: java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path
et il spécifie ces deux méthodes comme la question. J'étais sous l'impression que si je change les paramètres de la requête, le Printemps ne serait pas se plaindre de la même chose via ce post: http://www.coderanch.com/t/598675/Spring/handling-HTTP-Request-parameters mais à l'évidence cela ne fonctionne toujours. Quelqu'un aurait-il des suggestions sur la façon de contourner ce problème? Merci!
- Si j'envoie une demande à
http://your.server/rest/api/datasources/foo
, la méthode doit être appelée? Que diriez -http://your.server/rest/api/datasources/bar
? - ah oui, mais je n'ai pas de spécifier un autre jeu de paramètres de la demande pour les chemins?
- Non, tu n'a absolument pas à voir ma réponse.
- Vous n'avez pas spécifié quelque chose de différent. Si vous voulez itinéraire en fonction de paramètres de la requête, puis ajouter le
params
attribut à laRequestMapping
annotation, actuellement, à partir d'une cartographie de point de vue il n'y a rien de différent. - je suis juste confus ensuite parce que je pensais que
@RequestParam
voudrais faire cela pour moi. J'ai regardé stackoverflow.com/questions/13715811/... et qui semble dire que le@RequestParam
annotation est en effet pour le routage basé sur les paramètres.
Vous devez vous connecter pour publier un commentaire.
Ce qui est important pour Printemps à l'envoi de la demande de la partie du Chemin d'accès de l'URL.
Demander des mappages de capturer n'importe quelle valeur placée dans le chemin d'accès et il est impossible de distinguer la méthode qui doit être invoquée. Dans votre exemple de code, une demande de
www.example.com/rest/api/datasources/foo
pourrait être prise en charge pargetLatestApiMetadata
où "foo" est ledatasourceName
et également traitées pargetAllMetadata
où "foo" est leapiVersion
.HandlerMethodArgumentResolver
de la chaîne d'après la méthode de gestionnaire d'expédition de la demande a été déterminée. Sens les paramètres ne sont pas utiles pour la détermination de la méthode à appeler.getLatestMetaData
méthode de point final à ressembler à/rest/api/datasources/{datasourceName}
mais lagetAllMetadata
méthode de point final à ressembler à/rest/api/datasources/{apiVersion}?visibility=visibility
. C'est pourquoi j'ai fait@RequestParameter
requis pour lagetAllMetadata
méthode.