2012-04-29 15 views
11

जब भी मैं सभी पैरामीटर पारित नहीं किया गया था, मैं 404 पेज ट्रिगर करना चाहता हूं। चलो का कहना है कि मेरे पास है यूआरआई निम्नलिखित:स्प्रिंग एमवीसी - लापता पैरामीटर पर 404 कैसे वापस करें

/myapp/op?param1=1&[email protected]=3 

पैरामीटर नहीं दिया की पर मामले में टी लागू मैं 404 पृष्ठ वापस जाने के लिए चाहते हैं। मैं कर रहा करने की कोशिश की:

@ResponseStatus(HttpStatus.NOT_FOUND) 
@RequestMapping(value = "op", params = { "!param1" }) 
public void missingArg() { 
} 

लेकिन फिर मैं एक अपवाद मुझे बता तरीकों कि दूसरे और तीसरे पैरामीटर रहित संभाल के बीच अस्पष्टता नहीं है मिलता है।

मैं इसे कैसे पूरा कर सकता हूं?

उत्तर

27

आप स्प्रिंग 3.1 उपयोग कर रहे हैं आप तो जैसे एक अपवाद वर्ग को परिभाषित कर सकते हैं। उदाहरण के लिए:

@RequestMapping(value = "/op") 
public void methodWithRequestParams(@RequestParam(value = "param1", required = false) String param1, 
     @RequestParam(value = "param2", required = false) String param2) { 
    if (param1 == null || param2 == null) { 
    throw new ResourceNotFoundException(); 
    } 
} 

वापस आ जाएगी एक 404param1 या param2 रिक्त है जब भी।

+0

धन्यवाद, यह काम किया। यद्यपि यह समाधान मेरे लिए थोड़ा अजीब लगता है, लेकिन यह काम पूरा हो गया। – s0li

+0

आप कस्टम बॉडी/पेलोड कैसे प्राप्त करते हैं –

7

आपको missingArg() फ़ंक्शन को लागू करने की आवश्यकता नहीं है। यदि आने वाले अनुरोध के लिए कोई मिलान विधि नहीं है, तो वसंत HandlerExceptionResolver इसे संभाल लेंगे और उचित स्थिति कोड के साथ प्रतिक्रिया वापस कर देगा।

स्प्रिंग स्वचालित रूप से विधि मानकों में अनुरोध पैरामीटर में परिवर्तित कर देंगे अगर आप @RequestParam एनोटेशन का उपयोग करें: जब तक

@RequestMapping(value = "/op") 
public void methodWithRequestParams(@RequestParam("param1") String param1, 
     @RequestParam("param2") String param2, 
     @RequestParam("param3") String param3) { 

    // do something with params 
} 

परंपरा के मुताबिक, methodWithRequestParams() विधि कहा जाता है नहीं की जाएगी नहीं तो सभी पैरामीटर अनुरोध का हिस्सा हैं (required@RequestParam की विशेषता false पर सेट है)।

यह भी ध्यान रखें कि पैरामीटर स्ट्रिंग्स नहीं होने चाहिए। अब

@ResponseStatus(value = HttpStatus.NOT_FOUND) 
public final class ResourceNotFoundException extends RuntimeException { 
    // class definition 
} 

जब भी आप उस अपवाद फेंक, स्प्रिंग अपने @ResponseStatus एनोटेशन में परिभाषित http स्थिति वापस आ जाएगी:

+0

इस समस्या के साथ समस्या है कि repsonse कोड 400 (या 404 के अलावा कुछ और) है - मेरे पास नियंत्रण कोड या कौन सा पृष्ठ वापस नहीं किया जा रहा है पर नियंत्रण नहीं है। – s0li

+8

ठीक है, एक '400 - खराब अनुरोध 'मेरी राय में एक अधिक सटीक प्रतिक्रिया कोड है जो' 404' है। सभी संसाधनों के बाद ('/ op' url द्वारा पहचाना गया) मौजूद है, लेकिन अनुरोध पैरामीटर गलत हैं, यानी एक बुरा अनुरोध है। यदि आप एक विशिष्ट संसाधन और '404' प्रतिक्रिया चाहते हैं, यदि यह अस्तित्व में नहीं है, तो मेरा सुझाव है कि आप [@PathVariable] (http:/के साथ संयोजन में '@RequestMapping ("/op/{id} ") का उपयोग करें। /static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates) एनोटेशन। – matsev

1

किसी अन्य उत्तर की टिप्पणियों में matsev ने जो कहा, उसे प्रतिबिंबित करते हुए, आपको इस मामले में @ResponseStatus(HttpStatus.NOT_FOUND) का उपयोग नहीं करना चाहिए, बल्कि @ResponseStatus(HttpStatus.BAD_REQUEST)

@ResponseStatus(HttpStatus.NOT_FOUND) का उपयोग तब किया जाना चाहिए जब अनुरोध ठीक से बनाया गया था, लेकिन संसाधन वहां नहीं है।

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