Spring MVC路由到错误的操作

时间:2017-10-31 10:46:42

标签: java spring-mvc url-routing

我有以下控制器(遵循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"

我的代码有什么问题吗?提前谢谢。

2 个答案:

答案 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
    ) {
        ...
    }

    ...
}