2015-12-19 11 views
6

फायरिंग नहीं हैंडलर मैं निम्नलिखित नियंत्रक सलाह की स्थापना की, त्रुटि की स्थिति के लिए एक एपीआई अनुबंध लौटना पड़ा:स्प्रिंग बूट @ControllerAdvice अपवाद

@ControllerAdvice 
public class ExceptionHandler : ResponseEntityExceptionHandler() 
{ 
    @ExceptionHandler(Throwable::class) 
    @ResponseBody 
    public fun onException(ex: Throwable): ResponseEntity<ErrorResponse> 
    { 
     val errorResponse = ErrorResponse(
      response = ResponseHeader(ex.responseCode(), ex.message)) 
     return ResponseEntity(errorResponse, HttpStatus.UNAUTHORIZED); 
    } 

} 

यह था ठीक काम कर रहा है और फिर काम करना बंद कर। अब सभी अपवादों BasicErrorController ले जाया जाता है, जो इस प्रारूप प्रस्तुत करती है:

{ 
    "timestamp" : 1450495303166, 
    "status" : 403, 
    "error" : "Forbidden", 
    "message" : "Access Denied", 
    "path" : "/profile/candidates" 
} 

ऊपर एक अच्छा स्वच्छंद प्रारंभिक बिंदु है, लेकिन अब यह रास्ते से हट जाओ नहीं होंगे।

  • मैंने ExceptionHandlerExceptionResolver के एक उदाहरण के साथ त्रुटि हैंडलर को बदलने की कोशिश की है लेकिन यह काम नहीं करता है।
  • मैंने अपना खुद का कस्टमरर हैडलर बनाने का प्रयास किया है, लेकिन यह भी उपयुक्त नहीं था क्योंकि मूल अपवाद अब HttpServletRequest में कस्टम त्रुटि नियंत्रक के लिए फिर से रूट होने तक नहीं है। ग्राहक को उचित प्रतिक्रिया वापस करने के लिए इस जानकारी की आवश्यकता है।

मैं कैसे करने के लिए:

  • मेक एक अपवाद नियंत्रक से SpringBoot नहीं आगे अपवाद नहीं।
  • @ControllerAdvice अपवाद हैंडलर को पुनर्स्थापित करें, ताकि मैं एक उचित प्रतिक्रिया निकाय और स्थिति कोड वापस कर सकूं।

स्टार्टअप वसंत लॉग पर:

main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in exceptionHandler 
main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in responseEntityExceptionHandler 

संपादित करें:

स्प्रिंग बूट डॉक्स के माध्यम से पढ़ने के बाद, मैं अब खड़े कि BasicErrorController केवल किसी भी अपवाद के लिए गोली चलानी है के तहत @ControllerAdvice द्वारा संचालित नहीं है। ऐसा प्रतीत नहीं होता है। तो सवाल यह है कि क्यों?

उत्तर

1

मेरे पास एक स्प्रिंग सुरक्षा फ़िल्टर भी है जो एपीआई-कुंजी और एक्सेस-टोकन हेडर प्रमाण-पत्रों का मूल्यांकन करता है। @ControllerAdvice यहां काम नहीं करता है - काफी उचित है, बशर्ते हम नियंत्रक एंडपॉइंट से निपट नहीं रहे हैं!

सुरक्षा फ़िल्टर से अपवादों को संभालने के लिए EntryPoint और AcessDeniedHandler का उपयोग करें। वहाँ अंदर विन्यस्त किया जा सकता हैं:

.exceptionHandling() 

और FailureHandler कॉन्फ़िगर करता है, तो आप अपने फ़िल्टर में AbstractAuthenticationProcessingFilter फैली हुई है।

setAuthenticationFailureHandler() 

अफैक त्रुटि नियंत्रक ओवरराइट किया जाएगा यदि आप एप्लिकेशन सर्वर के तहत अपना आवेदन तैनात करेंगे।

+0

मैंने कोशिश की, लेकिन इसका पालन नहीं किया। मेरे उत्तर में दृष्टिकोण का उपयोग कर समाप्त हो गया। यकीन नहीं है कि यह एक अच्छा है। –