@PathVariable不与@RequestBody绑定

时间:2013-10-24 00:48:11

标签: spring validation spring-mvc binding path-variables

当我不使用@RequestBody时,@PathVariable id会自动设置在我的Entity课程中。但如果我使用@RequestBody则不然。我需要在id执行验证之前设置Entity GenericValidator。为什么没有@RequestBody而没有它呢?

实体类:

public class Entity {

    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    //...

}

控制器类:

@Controller
@RequestMapping(value = "/entity")
public class EntityController {

    @Autowired
    private GenericValidator validator;

    @InitBinder
    private void initBinder(WebDataBinder binder) {
        binder.addValidators(validator);
    }

    @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
    public @ResponseBody Response update(
            @PathVariable String id,
            @Valid @RequestBody Entity entity)
    {
        //...
    }
}

1 个答案:

答案 0 :(得分:3)

单独使用时,@ Valid的工作方式与@ModelAttribute非常相似。 Entity方法参数将从Model中检索或实例化,WebDataBinder将处理数据绑定过程(这是在设置id时),然后验证将发生。

@RequestBody参数不像@ModelAttribute参数那样经历数据绑定过程。它们是通过HttpMessageConverter使用请求主体创建的,而不是将请求参数和路径变量的名称与对象字段的名称相匹配。与@Valid结合使用时,将针对新对象运行已配置的验证程序,但仍不会发生@ModelAttribute样式数据绑定。