Метод сопоставления запросов по умолчанию выбран для других URL с переменной Path
У меня есть @RestController
ниже как ниже. Метод getTrain(long)
должен быть подобран для URL http://localhost:8080/trains/1
но вместо этого он набирает getTrains()
, Другие URL работают нормально, как и ожидалось. Я не уверен, что я что-то упускаю или не понимаю. Я также посмотрел на сопоставление запроса Spring с другим методом для определенного значения переменной пути, и это немного помогло.
Требования: 1. / поезда [POST] - добавить поезд 2. / поезда [GET] - получить все поезда 3. / поезда /{trainId} - получить поезд по id
@RestController
public class TrainController {
@Autowired
private TrainService trainService;
@RequestMapping(headers = { "Accept=application/json" }, method = RequestMethod.POST)
public TrainDto addTrain(@RequestBody TrainDto trainDto) throws Exception {
return trainService.addTrain(trainDto);
}
@RequestMapping(method = RequestMethod.GET)
public List<TrainDto> getTrains() throws Exception {
return trainService.getTrains();
}
@RequestMapping(value = "{trainId:\\d+}", method = RequestMethod.GET)
public TrainDto getTrain(@PathVariable("trainId") long trainId) throws Exception {
return trainService.getTrain(trainId);
}
}
2 ответа
Вы должны добавить значение = "" к запросу на отображение. Посмотрите, работает ли это
@RestController public class TrainController {
@Autowired
private TrainService trainService;
@RequestMapping(value = "/trains",headers = { "Accept=application/json" }, method = RequestMethod.POST)
public TrainDto addTrain(@RequestBody TrainDto trainDto) throws Exception {
return trainService.addTrain(trainDto);
}
@RequestMapping(value = "/trains",method = RequestMethod.GET)
public List<TrainDto> getTrains() throws Exception {
return trainService.getTrains();
}
@RequestMapping(value = "/trains/{trainId}", method = RequestMethod.GET)
public TrainDto getTrain(@PathVariable("trainId") long trainId) throws Exception {
return trainService.getTrain(trainId);
}
}
Или вы можете сделать это таким образом.
@RestController
@RequestMapping(TrainController.REQUEST_MAPPING_URL)
public class TrainController {
public static final String REQUEST_MAPPING_URL = "/trains";
@Autowired
private TrainService trainService;
@RequestMapping(value = "/",headers = { "Accept=application/json" }, method = RequestMethod.POST)
public TrainDto addTrain(@RequestBody TrainDto trainDto) throws Exception {
return trainService.addTrain(trainDto);
}
@RequestMapping(value = "/",method = RequestMethod.GET)
public List<TrainDto> getTrains() throws Exception {
return trainService.getTrains();
}
@RequestMapping(value = "/{trainId}", method = RequestMethod.GET)
public TrainDto getTrain(@PathVariable("trainId") long trainId) throws Exception {
return trainService.getTrain(trainId);
}
}
@RestController
public class TrainController {
@Autowired
private TrainService trainService;
@RequestMapping(headers = { "Accept=application/json" }, method = RequestMethod.POST)
public TrainDto addTrain(@RequestBody TrainDto trainDto) throws Exception {
return trainService.addTrain(trainDto);
}
@RequestMapping(method = RequestMethod.GET)
public List<TrainDto> getTrains() throws Exception {
return trainService.getTrains();
}
@RequestMapping(value = "{trainId}", method = RequestMethod.GET)
public TrainDto getTrain(@PathVariable("trainId") long trainId) throws Exception {
return trainService.getTrain(trainId);
}
}
Это будет работать. Значение внутри фигурных скобок, т.е. trainId, должно отображаться в PathVariable.