2013-10-24 25 views
5

@RequestBody kullanmıyorken @PathVariableid otomatik olarak Entity sınıfımda ayarlı. Ama ben @RequestBody kullanırsam değil. 'un id'un GenericValidator doğrulama işleminden önce ayarlanması gerekiyor. Neden @RequestBody olmadan çalışıyor ve onunla çalışmıyor?@PathVariable @RequestBody ile bağlanılamıyor

Entity sınıfı:

public class Entity { 

    private String id; 

    public String getId() { 
     return id; 
    } 

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

    //... 

} 

denetleyici sınıfı:

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

cevap

3

tek başına kullanıldığında, @Valid çok @ModelAttribute gibi çalışır. Varlık yöntemi argümanı, Model'den alınacak veya örneklendirilecek, WebDataBinder, veri bağlama işlemini ele alacaktır (bu, id'in ayarlanacağı zamandır) ve daha sonra doğrulama gerçekleşecektir. @RequestBody argümanları, @ModelAttribute argümanları gibi veri bağlama işleminden geçmez.

İstek parametrelerinin isimlerini ve yol değişkenlerini nesnenizin alan adlarına uydurmak yerine isteğin gövdesini kullanarak bir HttpMessageConverter üzerinden oluşturulurlar. @Valid ile birleştirildiğinde, yapılandırılmış doğrulayıcı yeni nesneye karşı çalıştırılır, ancak @ModelAttribute stil verisi hala bağlanamaz.

+1

Yani bu işi @RequestBody ile yapmanın bir yolu yok mu? – dblank

İlgili konular