7 votes

Comment résoudre la situation "ambiguë" du mappage des requêtes dans le contrôleur Spring ?

J'ai écrit un contrôleur Spring dans lequel je voulais utiliser une seule URL pour toutes les méthodes. Même si j'utilise des signatures de méthodes différentes int, string, object Je reçois une erreur.

@RequestMapping(value="problemAPI/ticket", method = RequestMethod.GET )
public @ResponseBody String getTicketData(@RequestParam("customerId") int customerId) {
    return "customer Id: "+customerId+" has active Ticket:1010101";
}

@RequestMapping(value="problemAPI/ticket", method = RequestMethod.GET )
public @ResponseBody String getTicketStatusByCustname(@RequestParam("customerName") String customerName) {  
    return "Mr." + customerName + " Your Ticket is Work in Progress";
}

@RequestMapping(value="problemAPI/ticket", method = RequestMethod.POST )
public @ResponseBody String saveTicket(@RequestBody TicketBean bean) {
    return "Mr." + bean.getCustomerName() + " Ticket" +  bean.getTicketNo() + " has been submitted successfuly";
}

Erreur :

java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'problemTicketController' bean method 
public String com.nm.controller.webservice.ticket.problem.ProblemTicketController.getTicketData(int)
to {[/problemAPI/ticket],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'problemTicketController' bean method
public java.lang.String com.nm.controller.webservice.ticket.problem.ProblemTicketController.getTicketByCustname(int) mapped.

21voto

Andrii Abramov Points 3881

Vous pouvez y parvenir en spécifiant explicitement les paramètres de la requête à l'aide de la commande params propriété d'annotation :

@RequestMapping(value = "problemAPI/ticket", params="customerId", method = RequestMethod.GET)
public @ResponseBody String getTicketData(@RequestParam("customerId") int customerId){
    return "customer Id: " + customerId + " has active Ticket:1010101";
}

@RequestMapping(value = "problemAPI/ticket", params="customerName", method = RequestMethod.GET)
public @ResponseBody String getTicketStatusByCustname(@RequestParam("customerName") String customerName){
    return "Mr." + customerName + " Your Ticket is Work in Progress";
}

Pour plus de clarté, vous pouvez utiliser des annotations de type alias telles que @GetMapping y @PostMapping :

@GetMapping(value="problemAPI/ticket", params="customerName")
public @ResponseBody String getTicketStatusByCustname(@RequestParam("customerName") String customerName)

@PostMapping(value="problemAPI/ticket")
public @ResponseBody String saveTicket(@RequestBody TicketBean bean) {
    return "Mr." + bean.getCustomerName() + " Ticket" +  bean.getTicketNo() + " has been submitted successfuly";
}

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