Spring Boot 4 की संपूर्ण मार्गदर्शिका · पाठ

@ControllerAdvice के साथ वैश्विक अपवाद प्रबंधन

@ExceptionHandler और @ControllerAdvice से अपवादों का स्वच्छ HTTP प्रतिक्रियाओं में रूपांतरण केंद्रीकृत कीजिए।

पाठ 3, कुल 4 में से13 चरण

@ControllerAdvice के साथ वैश्विक अपवाद प्रबंधन, CoddyKit पर Spring Boot 4 की संपूर्ण मार्गदर्शिका का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Spring Boot 4 की संपूर्ण मार्गदर्शिका सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Spring Boot 4 की संपूर्ण मार्गदर्शिका पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

अपवाद प्रबंधन को केंद्रीकृत क्यों करें?

जब Spring Boot REST API में कुछ गड़बड़ होती है, तो क्लाइंट को कच्चा स्टैक ट्रेस नहीं, बल्कि साफ़ और पूर्वानुमानित HTTP प्रतिक्रिया मिलनी चाहिए।

किसी रणनीति के बिना, आप हर नियंत्रक विधि में try/catch ब्लॉक बिखेर देते हैं और वही JSON बनाने वाला तर्क बार-बार दोहराते हैं।

  • एक ही प्रकार की त्रुटि के लिए असंगत स्थिति कोड
  • त्रुटि-प्रतिक्रिया का दोहराया हुआ प्रारूप
  • क्लाइंट तक आंतरिक विवरण (स्टैक ट्रेस, SQL) पहुँच जाना

वैश्विक अपवाद प्रबंधन अपवादों को एक ही स्थान पर HTTP प्रतिक्रियाओं में बदलकर इस समस्या का समाधान करता है।

@ExceptionHandler: मूल निर्माण खंड

मुख्य एनोटेशन @ExceptionHandler है। यह ऐसी विधि को चिह्नित करता है जो अनुरोध संसाधित करते समय उत्पन्न किसी विशेष अपवाद प्रकार को संभालती है।

जब इसे किसी नियंत्रक के अंदर रखा जाता है, तो यह केवल उसी नियंत्रक की हैंडलर विधियों से उत्पन्न अपवादों को पकड़ता है।

विधि का पैरामीटर बताता है कि वह कौन-सा अपवाद संभालती है, और उसका लौटाया गया मान HTTP प्रतिक्रिया बन जाता है।

@RestController
public class ProductController {

    @GetMapping("/products/{id}")
    public Product getProduct(@PathVariable Long id) {
        throw new ProductNotFoundException(id);
    }

    @ExceptionHandler(ProductNotFoundException.class)
    public ResponseEntity<String> handleNotFound(ProductNotFoundException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    }
}

@ControllerAdvice के साथ स्थानीय से वैश्विक तक

स्थानीय @ExceptionHandler केवल एक नियंत्रक पर लागू होता है। पूरे अनुप्रयोग में हैंडलर साझा करने के लिए उन्हें @ControllerAdvice से एनोटेट किए गए वर्ग में ले जाएँ।

@ControllerAdvice, @Component का विशेष रूप है। Spring इसकी @ExceptionHandler विधियों को वैश्विक रूप से पंजीकृत करता है, इसलिए मिलते-जुलते अपवाद उत्पन्न करने वाला कोई भी नियंत्रक यहाँ संभाला जाता है।

REST API के लिए @RestControllerAdvice को प्राथमिकता दें। यह @ControllerAdvice और @ResponseBody को मिलाता है, जिससे लौटाए गए मान अपने-आप JSON में क्रमबद्ध हो जाते हैं।

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ProductNotFoundException.class)
    public ResponseEntity<String> handleNotFound(ProductNotFoundException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    }
}

एकसमान त्रुटि प्रतिक्रिया बॉडी

कच्ची स्ट्रिंग लौटाना आम तौर पर पर्याप्त नहीं होता। क्लाइंट ऐसा संरचित और पूर्वानुमानित JSON बॉडी चाहते हैं जिसे वे पढ़ सकें।

एक छोटी त्रुटि प्रतिक्रिया रिकॉर्ड परिभाषित करें, जिसे हर हैंडलर लौटाए। यह साधारण Java है और इसके लिए किसी फ़्रेमवर्क की आवश्यकता नहीं है, इसलिए यह पूरी तरह स्वतंत्र है।

@RestControllerAdvice की विधि से लौटाए जाने पर Spring इस रिकॉर्ड को JSON में क्रमबद्ध करता है।

import java.time.Instant;

public record ApiError(
        Instant timestamp,
        int status,
        String error,
        String message,
        String path) {
}

public class Demo {
    public static void main(String[] args) {
        ApiError err = new ApiError(
                Instant.parse("2026-01-01T10:15:30Z"),
                404,
                "Not Found",
                "Product 42 not found",
                "/products/42");
        System.out.println(err);
    }
}

ResponseEntity के साथ संरचित त्रुटियाँ लौटाना

अब ApiError रिकॉर्ड को अपने वैश्विक हैंडलर के साथ मिलाइए। ऐसा ResponseEntity बनाइए जिसमें सही स्थिति कोड और संरचित बॉडी दोनों हों।

अनुरोध का पथ प्राप्त करने के लिए दिए गए HttpServletRequest का उपयोग करें। क्लाइंट की ओर से समस्या की जाँच करते समय यह उपयोगी होता है।

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ProductNotFoundException.class)
    public ResponseEntity<ApiError> handleNotFound(
            ProductNotFoundException ex, HttpServletRequest request) {

        ApiError error = new ApiError(
                Instant.now(),
                HttpStatus.NOT_FOUND.value(),
                HttpStatus.NOT_FOUND.getReasonPhrase(),
                ex.getMessage(),
                request.getRequestURI());

        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);
    }
}

@ResponseStatus के साथ स्थिति मैप करना

यदि कोई हैंडलर हमेशा एक ही स्थिति लौटाता है और आपको कस्टम हेडर की आवश्यकता नहीं है, तो आप ResponseEntity को पूरी तरह छोड़ सकते हैं।

हैंडलर विधि पर @ResponseStatus(...) लगाएँ और बॉडी सीधे लौटाएँ। Spring आपके लिए स्थिति कोड लागू कर देगा।

इससे सरल हैंडलर संक्षिप्त रहते हैं, लेकिन गतिशील स्थिति कोड या हेडर की आवश्यकता होने पर ResponseEntity का उपयोग करें।

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ProductNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public ApiError handleNotFound(ProductNotFoundException ex, HttpServletRequest req) {
        return new ApiError(Instant.now(), 404, "Not Found",
                ex.getMessage(), req.getRequestURI());
    }
}

सत्यापन त्रुटियों को संभालना

जब @Valid वाला अनुरोध बॉडी Bean Validation में विफल होता है, तो Spring MethodArgumentNotValidException उत्पन्न करता है। डिफ़ॉल्ट रूप से JSON प्रतिक्रिया बहुत विस्तृत और अनावश्यक विवरणों से भरी होती है।

अपनी सलाह में इसे ओवरराइड करके फ़ील्ड त्रुटियों का साफ़ मैप लौटाएँ। प्रत्येक FieldError में गलत फ़ील्ड का नाम और सत्यापन संदेश होता है।

@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, String> handleValidation(MethodArgumentNotValidException ex) {
    Map<String, String> errors = new HashMap<>();
    for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
        errors.put(fieldError.getField(), fieldError.getDefaultMessage());
    }
    return errors;
}

कई अपवादों के लिए एक हैंडलर

@ExceptionHandler अपवाद वर्गों की एक सारणी स्वीकार करता है, इसलिए एक ही विधि समान स्थिति में मैप होने वाले कई संबंधित प्रकारों को संभाल सकती है।

इससे दोहराया हुआ कोड बचता है; उदाहरण के लिए, कई अलग-अलग "गलत इनपुट" वाले अपवादों को 400 Bad Request में बदलना हो।

@ExceptionHandler({
        IllegalArgumentException.class,
        IllegalStateException.class,
        ConstraintViolationException.class
})
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ApiError handleBadRequest(RuntimeException ex, HttpServletRequest req) {
    return new ApiError(Instant.now(), 400, "Bad Request",
            ex.getMessage(), req.getRequestURI());
}

अपवाद समाधान का क्रम

जब कोई अपवाद उत्पन्न होता है, तो Spring सबसे विशिष्ट मिलते-जुलते @ExceptionHandler को चुनता है।

  • सटीक प्रकार वाला हैंडलर, उसके मूल वर्ग वाले हैंडलर पर प्राथमिकता पाता है।
  • नियंत्रक में मौजूद स्थानीय हैंडलर, @ControllerAdvice में मौजूद वैश्विक हैंडलर पर प्राथमिकता पाते हैं।
  • यदि दो हैंडलर समान रूप से विशिष्ट हों, तो Spring शुरू होते समय अस्पष्टता की त्रुटि उत्पन्न करता है।

यह क्रम आपको व्यापक वैकल्पिक व्यवस्था देने के साथ-साथ विशिष्ट मामलों को अलग तरीके से संभालने देता है।

सुरक्षित सर्वव्यापी वैकल्पिक व्यवस्था

हमेशा Exception.class के लिए अंतिम उपाय वाला हैंडलर उपलब्ध रखें। यह उन सभी चीज़ों को पकड़ता है जिन्हें आपने स्पष्ट रूप से मैप नहीं किया और आंतरिक विवरण लीक होने से रोकता है।

एक सुरक्षित संदेश के साथ सामान्य 500 Internal Server Error लौटाएँ और जाँच के लिए वास्तविक अपवाद को सर्वर पर लॉग करें।

अप्रत्याशित त्रुटियों के लिए कच्चे अपवाद संदेश या स्टैक ट्रेस को क्लाइंट की प्रतिक्रिया में कभी न रखें।

@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ApiError handleAny(Exception ex, HttpServletRequest req) {
    log.error("Unhandled exception at {}", req.getRequestURI(), ex);
    return new ApiError(Instant.now(), 500, "Internal Server Error",
            "An unexpected error occurred", req.getRequestURI());
}

दायरा निर्धारित करना और फ़्रेमवर्क के मूल वर्ग का विस्तार करना

आप @RestControllerAdvice(basePackages = "com.shop.api") या assignableTypes = {...} जैसी विशेषताओं का उपयोग करके सलाह को कुछ नियंत्रकों तक सीमित कर सकते हैं। बिना दायरे वाली सलाह हर जगह लागू होती है।

Spring MVC की अंतर्निहित अपवाद व्यवस्था पर पूरा नियंत्रण पाने के लिए ResponseEntityExceptionHandler का विस्तार करें और उसकी संरक्षित विधियों को ओवरराइड करें। इसमें मानक MVC अपवादों के लिए हैंडलर पहले से घोषित होते हैं।

@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(ProductNotFoundException.class)
    public ResponseEntity<ApiError> handleNotFound(
            ProductNotFoundException ex, HttpServletRequest req) {
        ApiError error = new ApiError(Instant.now(), 404, "Not Found",
                ex.getMessage(), req.getRequestURI());
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);
    }
}

त्वरित जाँच

आपके पास एक REST API है। आप चाहते हैं कि हर नियंत्रक में सत्यापन और संसाधन न मिलने की त्रुटियाँ एक ही स्थान पर, एकसमान JSON बॉडी और सही स्थिति कोड उत्पन्न करें। इसका Spring Boot में प्रचलित तरीका क्या है?

पुनरावृत्ति

आपने Spring Boot में अपवाद प्रबंधन को केंद्रीकृत करना सीखा:

  • @ExceptionHandler किसी अपवाद प्रकार को HTTP प्रतिक्रिया से मैप करता है; अकेले यह नियंत्रक तक सीमित रहता है।
  • @RestControllerAdvice हैंडलर को वैश्विक रूप से पंजीकृत करता है और लौटाए गए मानों को JSON में क्रमबद्ध करता है।
  • पूर्वानुमानित क्लाइंट के लिए एकसमान त्रुटि रिकॉर्ड (स्थिति, संदेश, पथ, समय-चिह्न) लौटाएँ।
  • गतिशील स्थिति या हेडर के लिए ResponseEntity और स्थिर स्थिति के लिए @ResponseStatus का उपयोग करें।
  • साफ़ सत्यापन त्रुटियों के लिए MethodArgumentNotValidException संभालें, संबंधित अपवादों को समूहित करें और हमेशा ऐसा Exception.class सर्वव्यापी हैंडलर जोड़ें जो आंतरिक विवरण छिपाए।

परिणामस्वरूप आपके पूरे API में त्रुटि प्रतिक्रियाएँ एकसमान, सुरक्षित और आसानी से अनुरक्षित रहती हैं।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Java सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
21
पाठ
84

अक्सर पूछे जाने वाले प्रश्न

क्या “@ControllerAdvice के साथ वैश्विक अपवाद प्रबंधन” पाठ निःशुल्क है?

हाँ — Spring Boot 4 की संपूर्ण मार्गदर्शिका अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “@ControllerAdvice के साथ वैश्विक अपवाद प्रबंधन” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Spring Boot 4 की संपूर्ण मार्गदर्शिका पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“@ControllerAdvice के साथ वैश्विक अपवाद प्रबंधन” में मैं क्या सीखूँगा?

@ExceptionHandler और @ControllerAdvice से अपवादों का स्वच्छ HTTP प्रतिक्रियाओं में रूपांतरण केंद्रीकृत कीजिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Spring Boot 4 की संपूर्ण मार्गदर्शिका का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Spring Boot 4 की संपूर्ण मार्गदर्शिका शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Spring Boot 4 की संपूर्ण मार्गदर्शिका शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“@ControllerAdvice के साथ वैश्विक अपवाद प्रबंधन” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Spring Boot 4 की संपूर्ण मार्गदर्शिका पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Spring Boot 4 की संपूर्ण मार्गदर्शिका पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Bean Validation बाधाएँ और बाधा समूह
  2. कस्टम बाधा एनोटेशन बनाना
  3. @ControllerAdvice के साथ वैश्विक अपवाद प्रबंधन
  4. RFC 7807 Problem Detail प्रतिक्रियाएँ
← Spring Boot 4 की संपूर्ण मार्गदर्शिका पर वापस जाएँ