我有以下控制器(遵循Rails命名约定)
@RestController("/vehicles")
public class VehiclesController {
@GetMapping
public Iterable<Vehicle> index(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "25") int per
) {
...
}
@GetMapping("/{id}")
public Vehicle show(@PathVariable long id) {
...
}
@PostMapping
public Vehicle create(@RequestBody Vehicle vehicle) {
...
}
@PatchMapping("/{id}")
public void update(@PathVariable long id, @RequestBody Vehicle params) {
...
}
@DeleteMapping("/{id}")
public void destroy(@PathVariable long id) {
...
}
}
每次发送请求
GET /vehicles
我希望请求被路由到index
方法,但它实际上被路由到show
方法然后无法提供内容,因为框架无法将"vehicles"
转换为一个long
。以下是错误消息:
Failed to bind request element: org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'long'; nested exception is java.lang.NumberFormatException: For input string: "vehicles"
我的代码有什么问题吗?提前谢谢。
答案 0 :(得分:0)
这不正确。
@RestController("/vehicles")
值(&#34; / vehicles&#34;)是组件的名称
为了添加REST路径,您需要在类上使用 @RestController 注释和 @RequestMapping 注释。
@RestController()
@RequestMapping(value = "/vehicles")
值 / vehicles 是HTTP调用的后缀。
您还必须更改索引方法上的注释:
@RequestMapping(value = "", method = RequestMethod.GET)
public Iterable<Vehicle> index(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "25") int per
)
并且一切都应该按预期工作。
答案 1 :(得分:0)
value
注释的@RestController
属性不是路径前缀,而是bean名称。要为控制器中的所有带注释的方法提供前缀,请使用@RequestMapping("/vehicles")
注释控制器类。
@RestController
@RequestMapping("/vehicles")
public class VehiclesController {
@GetMapping
public Iterable<Vehicle> index(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "25") int per
) {
...
}
...
}