6

当我不使用时@RequestBody,会在我的课堂@PathVariable id上自动设置。Entity但如果我使用@RequestBody它不是。我需要在执行验证之前设置idof 。为什么它在没有它和没有它的情况下都有效?EntityGenericValidator@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)
    {
        //...
    }
}
4

1 回答 1

3

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

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

于 2013-10-24T03:52:48.780 回答