2013-10-24 15 views
5

Khi tôi không sử dụng @RequestBody, @PathVariableid được tự động đặt ở lớp Entity của tôi. Nhưng nếu tôi sử dụng @RequestBody thì không. Tôi cần rằng id của Entity được đặt trước khi GenericValidator thực thi xác thực của tôi. Tại sao nó hoạt động mà không có @RequestBody và không có nó?@PathVariable không ràng buộc với @RequestBody

Entity lớp:

public class Entity { 

    private String id; 

    public String getId() { 
     return id; 
    } 

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

    //... 

} 

Bộ điều khiển lớp:

@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) 
    { 
     //... 
    } 
} 

Trả lời

3

Khi sử dụng một mình, @Valid hoạt động giống như @ModelAttribute. Đối số phương thức Entity sẽ được lấy ra từ Model hoặc instantiated, WebDataBinder sẽ xử lý quá trình liên kết dữ liệu (đây là khi id được thiết lập), và sau đó xác nhận hợp lệ sẽ xảy ra.

@Yêu cầu đối sốBody không trải qua quá trình ràng buộc dữ liệu như đối số @ModelAttribute. Chúng được tạo thông qua một HttpMessageConverter bằng cách sử dụng phần thân của yêu cầu thay vì kết hợp tên của các tham số yêu cầu và các biến đường dẫn tới tên của các trường của đối tượng của bạn. Khi được kết hợp với @Valid, trình xác thực được định cấu hình được chạy với đối tượng mới nhưng liên kết dữ liệu kiểu @ModelAttribute vẫn không xảy ra.

+1

vì vậy không có cách nào để thực hiện công việc này với @RequestBody? – dblank

Các vấn đề liên quan