У меня есть следующий контроллер:
@RestController
@RequestMapping("/api/{brand}")
public class CarController {
private final CarService carService;
@Autowird
public CarController(CarService carService) {
this.carService = carService;
}
@GetMapping
public Resources<Car> getCars(@PathVariable("brand") String brand) {
return new Resources<>(carService.getCars(brand));
}
@GetMapping(value = "/{model}")
public Car getModel(@PathVariable("brand") String brand, @PathVariable("model") String model) {
return carService.getCar(brand, model);
}
}
Я ожидал бы, что вызов HTTP GET для http://localhost:8080/api/bmw
вернет мне результат метода getCars
. Вместо этого вызов делегируется методу getModel
. Это возвращает ошибку, поскольку отсутствует {model}
переменная пути.
Почему мои вызовы http делегируются неверному @GetMapping
?
Здесь вы можете увидеть версию spring-boot-starter-web
что я использую через hateoas
:
[INFO] + - org.springframework.boot: spring-boot-starter-hateoas: jar: 2.1.9.RELEASE: compile
[ИНФО] | + - org.springframework.boot: spring-boot-starter-web: jar: 2.1.9.RELEASE: компилировать
[INFO] | | - org.springframework.boot: spring-boot-starter-tomcat: jar: 2.1.9. ВЫПУСК: компилировать
[ИНФО] | | + - org. apache .tomcat.embed: tomcat-embed-core: jar: 9.0.26: компилировать
[ИНФО] | | - org. apache .tomcat.embed: tomcat-embed-websocket: jar: 9.0.26: скомпилировать
[ИНФО] | + - org.springframework.hateoas: spring-hateoas: jar: 0.25.2.RELEASE: compile
[INFO] | - org.springframework.plugin: spring-plugin-core: jar: 1.2.0.RELEASE: compile
Я включил конечную точку mappings
Spring Actuator и могу даже видеть, что доступна конечная точка, которая игнорируется:
{
"handler": "public org.springframework.hateoas.Resources<com.example.Car> com.example.CarController.getCars(java.lang.String)",
"predicate": "{GET /api/{brand}, produces [application/hal+json]}",
"details": {
"handlerMethod": {
"className": "com.example.CarController",
"name": "getCars",
"descriptor": "(Ljava/lang/String;)Lorg/springframework/hateoas/Resources;"
},
"requestMappingConditions": {
"consumes": [],
"headers": [],
"methods": [
"GET"
],
"params": [],
"patterns": [
"/api/{brand}"
],
"produces": [
{
"mediaType": "application/hal+json",
"negated": false
}
]
}
}
}
РЕДАКТИРОВАТЬ Я добавил перехватчик , который позволяет мне видеть, какой будет цель handlerMethod
.
Правильный номер handlerMethod
:
publi c org.springframework.hateoas.Resources com.example.CarController.getCars (java .lang.String )
Тем не менее я все еще получаю следующую ошибку:
Внутренняя ошибка сервера: отсутствует переменная шаблона URI 'модель' для параметра метода типа String
Я не могу обернуть голову тем фактом, что handlerMethod
не ожидает параметр model
, но из-за него пружина все равно выдает ошибку.