2015-12-16 5 views
6

मुझे this question में वसंत बूट 1.3.0 का उपयोग करके और @RestController, @Path और @Service के साथ एनोटेटेड नहीं होने वाले मेरे नियंत्रकों को एक ही समस्या का सामना करना पड़ा है। कि प्रश्न में ओ पी कहते हैं,स्प्रिंग बूट के पुनर्निर्देशन को/त्रुटि में कैसे संभालें?

इस, मेरे लिए, लेकिन समझदार

कुछ भी मैं यह भी नहीं समझ सकता क्यों वे यह/त्रुटि को अनुप्रेषित होता है। और यह बहुत संभावना है कि मुझे कुछ याद आ रहा है, क्योंकि मैं केवल ग्राहक को 404 या 200s वापस दे सकता हूं।

मेरी समस्या यह है कि उनका समाधान 1.3.0 के साथ काम नहीं कर रहा है, इसलिए मेरे पास निम्न अनुरोध प्रवाह है: मान लें कि मेरा कोड NullPointerException फेंकता है। यह मेरी ExceptionMapper रों

@Provider 
public class GeneralExceptionMapper implements ExceptionMapper<Throwable> { 

    private static final Logger LOGGER = LoggerFactory.getLogger(GeneralExceptionMapper.class); 

    @Override 
    public Response toResponse(Throwable exception) { 
     LOGGER.error(exception.getLocalizedMessage()); 
     return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); 
    } 
} 

में से एक द्वारा नियंत्रित किया जाएगा और मेरे कोड लौटाता है एक 500 है, लेकिन बजाय इसे वापस ग्राहक के लिए भेजने के लिए, यह/त्रुटि के लिए यह रीडायरेक्ट करने के लिए कोशिश करता है। मुझे लगता है कि के लिए एक और संसाधन की जरूरत नहीं है, यह एक 404.

2015-12-16 18:33:21.268 INFO 9708 --- [nio-8080-exec-1] o.glassfish.jersey.filter.LoggingFilter : 1 * Server has received a request on thread http-nio-8080-exec-1 
1 > GET http://localhost:8080/nullpointerexception 
1 > accept: */* 
1 > host: localhost:8080 
1 > user-agent: curl/7.45.0 

2015-12-16 18:33:29.492 INFO 9708 --- [nio-8080-exec-1] o.glassfish.jersey.filter.LoggingFilter : 1 * Server responded with a response on thread http-nio-8080-exec-1 
1 < 500 

2015-12-16 18:33:29.540 INFO 9708 --- [nio-8080-exec-1] o.glassfish.jersey.filter.LoggingFilter : 2 * Server has received a request on thread http-nio-8080-exec-1 
2 > GET http://localhost:8080/error 
2 > accept: */* 
2 > host: localhost:8080 
2 > user-agent: curl/7.45.0 

2015-12-16 18:33:37.249 INFO 9708 --- [nio-8080-exec-1] o.glassfish.jersey.filter.LoggingFilter : 2 * Server responded with a response on thread http-nio-8080-exec-1 
2 < 404 

और ग्राहक की ओर (curl) वापस भेज देंगे:

$ curl -v http://localhost:8080/nullpointerexception 
* STATE: INIT => CONNECT handle 0x6000572d0; line 1090 (connection #-5000) 
* Added connection 0. The cache now contains 1 members 
* Trying ::1... 
* STATE: CONNECT => WAITCONNECT handle 0x6000572d0; line 1143 (connection #0) 
* Connected to localhost (::1) port 8080 (#0) 
* STATE: WAITCONNECT => SENDPROTOCONNECT handle 0x6000572d0; line 1240 (connection #0) 
* STATE: SENDPROTOCONNECT => DO handle 0x6000572d0; line 1258 (connection #0) 
> GET /nullpointerexception HTTP/1.1 
> Host: localhost:8080 
> User-Agent: curl/7.45.0 
> Accept: */* 
> 
* STATE: DO => DO_DONE handle 0x6000572d0; line 1337 (connection #0) 
* STATE: DO_DONE => WAITPERFORM handle 0x6000572d0; line 1464 (connection #0) 
* STATE: WAITPERFORM => PERFORM handle 0x6000572d0; line 1474 (connection #0) 
* HTTP 1.1 or later with persistent connection, pipelining supported 
< HTTP/1.1 404 Not Found 
* Server Apache-Coyote/1.1 is not blacklisted 
< Server: Apache-Coyote/1.1 
< Content-Length: 0 
< Date: Wed, 16 Dec 2015 17:33:37 GMT 
< 
* STATE: PERFORM => DONE handle 0x6000572d0; line 1632 (connection #0) 
* Curl_done 
* Connection #0 to host localhost left intact 

तो यह हमेशा एक 404. जब तक मैं क्या ज़रूरत है ऐसा एक/त्रुटि संसाधन, तो क्या? मुझे वापस क्या करना चाहिए? मेरे पास उस बिंदु पर एक गेट अनुरोध/त्रुटि है। और मैं उन अतिरिक्त अनुरोधों को संसाधनों का उपभोग नहीं करना चाहता हूं और अपने लॉग प्रदूषित नहीं करना चाहता हूं।

मुझे क्या याद आ रही है? और यदि कुछ भी नहीं है, तो मुझे अपने अपवाद हैंडलिंग के साथ क्या करना चाहिए?

उत्तर

2

आप जर्सी संपत्ति ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR से true सेट कर सकते हैं।

प्रतिसाद स्थिति है जब भी 4xx या 5xx यह कंटेनर विशिष्ट प्रतिक्रिया कार्यान्वयन पर sendError या setStatus के बीच चयन करने के लिए संभव है। जैसे सर्वलेट कंटेनर जर्सी पर HttpServletResponse.setStatus(...) या HttpServletResponse.sendError(...) पर कॉल कर सकते हैं।

sendError(...) विधि कॉलिंग आमतौर पर इकाई, प्रतिक्रिया हेडर रीसेट करता है और निर्दिष्ट स्थिति कोड (जैसे सर्वलेट error-page विन्यास) के लिए त्रुटि पृष्ठ प्रदान करते हैं। हालांकि अगर आप पोस्ट-प्रोसेस प्रतिक्रिया (जैसे सर्वलेट फ़िल्टर द्वारा) करना चाहते हैं तो इसे करने का एकमात्र तरीका कंटेनर प्रतिक्रिया ऑब्जेक्ट पर setStatus(...) पर कॉल करना है।

यदि संपत्ति मूल्य सही है तो विधि Response.setStatus(...) डिफ़ॉल्ट Response.sendError(...) पर उपयोग की जाती है।

संपत्ति मूल्य का प्रकार boolean है। डिफ़ॉल्ट मान false है।

आप बस अपनी ResourceConfig उपवर्ग निर्माता में property(key, value) फोन करके जर्सी गुण सेट कर सकते हैं।

+0

एक आकर्षण की तरह काम करता है – mark951131b