2013-07-03 17 views
6

मेरे पास स्प्रिंग 3.2 एप्लिकेशन है और मैंने स्प्रिंग एमवीसी के आधार पर this उदाहरण के बाद एक आरईएसटी एपीआई बनाया है। अब मुझे विभिन्न http विधियों (उदा .: POST और PUT विधियों) के लिए कुछ डेटा मान्य करने का प्रयास करते समय कुछ समस्याएं आ रही हैं।स्प्रिंग रेस्ट एपीआई सत्यापन

public class myItem{ 

    @NotEmpty 
    private String foo; 

    @NotEmpty 
    private String bar; 

    public myItem(String foo){ 
     this.foo = foo; 
     this.bar = ""; 
    } 

    public myItem(String foo, String bar){ 
     this.foo = foo; 
     this.bar = bar; 
    } 

    /* getters & setters omitted */ 

} 

यह POJO अलग अनुरोध तरीकों में पुन: उपयोग किया जाता है:

यह एक बहुत सरल उदाहरण होगा।

यह मेरा सरलीकृत नियंत्रक होगा:

@Controller 
@RequestMapping("/api/item") 
public class myItemController{ 

    @RequestMapping(value="/", method=RequestMethod.POST) 
    @ResponseStatus(HttpStatus.CREATED) 
    public @ResponseBody myItem createItem(@Valid @RequestBody myItem item){ 
     /* do some stuff */ 
     return item; //inserted item returned 
    } 

    @RequestMapping(value="/", method=RequestMethod.PUT) 
    @ResponseStatus(HttpStatus.NO_CONTENT) 
    public @ResponseBody myItem createItem(@Valid @RequestBody myItem item){ 
     /* do some stuff */ 
     return item //updated item returned 
    } 
} 

POST विधि मैं केवल उम्मीद foo फ़ील्ड सेट किया जा करने के लिए, तो इस अनुरोध के ऊपर टिप्पणी से पहले के साथ विफल हो जाएगा। PUT विधि में मैं foo और bar फ़ील्ड दोनों सेट होने की अपेक्षा करता हूं, इसलिए यह अनुरोध सफलतापूर्वक पूरा हो जाएगा।

इस तरह की स्थितियों से निपटने के लिए सही दृष्टिकोण क्या है: एक निश्चित अनुरोध विधि में आप सभी फ़ील्ड भरने की उम्मीद नहीं करते हैं (कुछ फ़ील्ड में डिफ़ॉल्ट मान हो सकते हैं, इसलिए आप सभी को जांचना नहीं चाहते हैं उन्हें, उर्फ ​​बनाने), और एक और विधि में आपको सभी क्षेत्रों (उर्फ अपडेट) की जांच करनी होगी।

उत्तर

9

उपयोग सत्यापन समूहों:

public interface ValidateOnCreate {} 
public interface ValidateOnUpdate {} 

public class myItem{ 
    @NotEmpty(groups = { ValidateOnCreate.class, ValidateOnUpdate.class }) 
    private String foo; 

    @NotEmpty(groups = ValidateOnUpdate.class) 
    private String bar; 
    ... 
} 

@RequestMapping(value="/", method=RequestMethod.POST) 
@ResponseStatus(HttpStatus.CREATED) 
public @ResponseBody myItem createItem(
    @Validated(ValidateOnCreate.class) @RequestBody myItem item) { ... } 

@RequestMapping(value="/", method=RequestMethod.PUT) 
@ResponseStatus(HttpStatus.NO_CONTENT) 
public @ResponseBody myItem createItem(
    @Validated(ValidateOnUpdate.class) @RequestBody myItem item) { ... } 

ध्यान दें कि आप इस मामले में वसंत-विशिष्ट @Validated की जरूरत है, क्योंकि @Valid आप समूहों को निर्दिष्ट करने के लिए अनुमति नहीं है।

यह भी देखें:

+0

यह एकदम सही जवाब है। यह एक अच्छा दिन था जब उन्होंने https://jira.springsource.org/browse/SPR-6373 – digitaljoel

+0

को सीखने के लिए बहुत कुछ छोड़ा ... बहुत सराहना की, धन्यवाद! – jarandaf

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