当我不使用@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)
{
//...
}
}
答案 0 :(得分:3)
单独使用时,@ Valid的工作方式与@ModelAttribute非常相似。 Entity方法参数将从Model中检索或实例化,WebDataBinder将处理数据绑定过程(这是在设置id时),然后验证将发生。
@RequestBody参数不像@ModelAttribute参数那样经历数据绑定过程。它们是通过HttpMessageConverter使用请求主体创建的,而不是将请求参数和路径变量的名称与对象字段的名称相匹配。与@Valid结合使用时,将针对新对象运行已配置的验证程序,但仍不会发生@ModelAttribute样式数据绑定。