@PathVariable无法与@RequestBody绑定

6
当我不使用@RequestBody时,@PathVariable中的id会自动设置为我的Entity类。但是如果我使用@RequestBody,它就不会这样做。我需要在我的GenericValidator执行验证之前设置Entityid。为什么没有@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个回答

2
当单独使用时,@Valid的工作方式类似于@ModelAttribute。实体方法参数将从模型中检索或实例化,WebDataBinder将处理数据绑定过程(此时将设置id),然后进行验证。
@RequestBody参数不像@ModelAttribute参数那样经过数据绑定过程。它们是通过HttpMessageConverter使用请求的主体创建的,而不是将请求参数和路径变量的名称与对象字段的名称匹配。当与@Valid结合使用时,配置的验证器将针对新对象运行,但仍不会发生@ModelAttribute风格的数据绑定。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接