2013-10-24 5 views
5

के साथ बाध्यकारी नहीं है जब मैं @RequestBody का उपयोग नहीं करता @PathVariableid स्वचालित रूप से मेरे Entity कक्षा पर सेट हो जाता है। लेकिन अगर मैं @RequestBody का उपयोग करता हूं तो यह नहीं है। मुझे idEntity की GenericValidator मान्यताओं को निष्पादित करने से पहले सेट किया गया है। यह @RequestBody के बिना क्यों काम करता है और इसके साथ नहीं?@PathVariable @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) 
    { 
     //... 
    } 
} 

उत्तर

3

जब अकेले इस्तेमाल किया, @Valid ज्यादा @ModelAttribute तरह काम करता है। इकाई विधि तर्क को मॉडल या तत्काल से पुनर्प्राप्त किया जाएगा, वेबडेटाइंडर डेटा बाध्यकारी प्रक्रिया को संभालेगा (यह तब होता है जब आईडी सेट की जाएगी), और तब सत्यापन होगा।

@RequestBody तर्क डेटा बाध्यकारी प्रक्रिया जैसे @ModelAttribute तर्कों के माध्यम से नहीं जाते हैं। वे आपके ऑब्जेक्ट के फ़ील्ड के नाम पर अनुरोध पैरामीटर और पथ चर के नामों से मेल खाने के बजाय अनुरोध के शरीर का उपयोग करके एक HttpMessageConverter के माध्यम से बनाए जाते हैं। @Valid के साथ संयुक्त होने पर, कॉन्फ़िगर किए गए सत्यापनकर्ता को नई ऑब्जेक्ट के विरुद्ध चलाया जाता है लेकिन @ModelAttribute शैली डेटा बाध्यकारी अभी भी नहीं होता है।

+1

तो इस काम को @RequestBody के साथ बनाने का कोई तरीका नहीं है? – dblank

संबंधित मुद्दे