代码之家  ›  专栏  ›  技术社区  ›  Aetherus

Spring MVC走向错误动作

  •  0
  • Aetherus  · 技术社区  · 7 年前

    我有以下控制器(遵循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 回复  |  直到 7 年前
        1
  •  1
  •   Maciej Walkowiak    7 年前

    这个 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
        ) {
            ...
        }
    
        ...
    }
    
        2
  •  0
  •   db80    7 年前

    这是不正确的。

    @RestController("/vehicles")
    

    为了添加一个REST路径,您需要 @RestController 注释和 @请求映射 类上的注释。

    @RestController()
    @RequestMapping(value = "/vehicles")
    

    /车辆 是HTTP调用的后缀。

    您还必须更改 指数 方法:

    @RequestMapping(value = "", method = RequestMethod.GET)
    public Iterable<Vehicle> index(
        @RequestParam(defaultValue = "1") int page,
        @RequestParam(defaultValue = "25") int per
    )
    

    一切都应该按预期进行。