@ControllerAdvice হল Spring Framework-এ একটি বিশেষ অ্যানোটেশন যা গ্লোবাল এক্সেপশন হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়। এটি Spring MVC অ্যাপ্লিকেশন-এ যেকোনো @Controller থেকে ফেলা হওয়া এক্সেপশনগুলি কেন্দ্রীভূতভাবে হ্যান্ডল করতে সাহায্য করে। @ControllerAdvice একটি কন্ট্রোলারকে গ্লোবাল স্কোপে এক্সেপশন হ্যান্ডলিংয়ের জন্য অ্যাপ্লিকেশন জুড়ে কার্যকর করে তোলে।
এটি এক্সেপশন হ্যান্ডলিংয়ের জন্য খুবই সুবিধাজনক, কারণ আপনি আলাদা আলাদা কন্ট্রোলারগুলিতে এক্সেপশন হ্যান্ডলিং কাস্টমাইজ করার বদলে একটি কেন্দ্রীয়ভাবে একটি গ্লোবাল কন্ট্রোলার তৈরি করতে পারেন।
@ControllerAdvice এর প্রধান ফিচার
- Global Exception Handling: এটি সমস্ত @Controller-এ এক্সেপশন হ্যান্ডলিংয়ের জন্য গ্লোবালভাবে কাজ করে।
- Exception Binding: এক্সেপশন হ্যান্ডলার মেথডে নির্দিষ্ট এক্সেপশন কেসের জন্য ডাটা পাস করতে পারেন।
- Model Manipulation: আপনি এক্সেপশন হ্যান্ডলার মেথডে মডেল অ্যাট্রিবিউটের মাধ্যমে ভিউতে ডেটা পাঠাতে পারেন।
- Multiple Exception Handling: একাধিক এক্সেপশন টাইপের জন্য একাধিক মেথড ব্যবহার করা যায়।
@ControllerAdvice এর মাধ্যমে Global Exception Handling কিভাবে কাজ করে
1. @ControllerAdvice এর সাথে এক্সেপশন হ্যান্ডলিং কনফিগারেশন
@ControllerAdvice একটি ক্লাসে ব্যবহার করা হয় যা @ExceptionHandler, @ModelAttribute, এবং @InitBinder অ্যানোটেশনগুলি প্রয়োগ করতে পারে।
2. ControllerAdvice Class তৈরি করা
@ControllerAdvice ব্যবহার করে একটি গ্লোবাল এক্সেপশন হ্যান্ডলিং কন্ট্রোলার তৈরি করতে হবে।
GlobalExceptionHandler.java:
import org.springframework.http.HttpStatus;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
@ControllerAdvice
public class GlobalExceptionHandler {
// Handling general Exception
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public String handleGeneralException(Exception ex, Model model) {
model.addAttribute("errorMessage", ex.getMessage());
return "error"; // This will map to /WEB-INF/jsp/error.jsp or Thymeleaf view
}
// Handling specific exception, e.g., NullPointerException
@ExceptionHandler(NullPointerException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleNullPointerException(NullPointerException ex, Model model) {
model.addAttribute("errorMessage", "Null Pointer Exception occurred: " + ex.getMessage());
return "error"; // Return the view to show the error
}
}
এখানে, @ControllerAdvice কন্ট্রোলারটি পুরো অ্যাপ্লিকেশন জুড়ে এক্সেপশন হ্যান্ডলিং করবে। আপনি @ExceptionHandler অ্যানোটেশন দিয়ে একাধিক এক্সেপশন টাইপ কভার করতে পারেন। উপরের কোডে, NullPointerException এবং Exception দুটি আলাদা ধরনের এক্সেপশন হ্যান্ডল করা হয়েছে।
3. View Page (Error Handling)
error.jsp (JSP):
<!DOCTYPE html>
<html>
<head>
<title>Error</title>
</head>
<body>
<h2>Error Occurred: ${errorMessage}</h2>
</body>
</html>
error.html (Thymeleaf):
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Error</title>
</head>
<body>
<h2 th:text="'Error Occurred: ' + ${errorMessage}"></h2>
</body>
</html>
4. Controller Example with Exception
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MyController {
@GetMapping("/causeError")
public String causeError() {
// Simulating an exception
throw new NullPointerException("This is a simulated exception!");
}
}
এটি /causeError URL এ গিয়ে একটি NullPointerException সৃষ্টি করবে, যা গ্লোবাল এক্সেপশন হ্যান্ডলার দ্বারা হ্যান্ডল করা হবে।
@ControllerAdvice-এ অন্যান্য কার্যক্রম
- @ModelAttribute: আপনি
@ControllerAdvice-এর মাধ্যমে মডেল অ্যাট্রিবিউট গ্লোবালি সেট করতে পারেন, যা সমস্ত কন্ট্রোলারের জন্য প্রযোজ্য।
@ControllerAdvice
public class GlobalModelAttributes {
@ModelAttribute("appName")
public String populateAppName() {
return "My Spring Application";
}
}
এখানে, আপনি সমস্ত কন্ট্রোলারের ভিউতে একটি অ্যাট্রিবিউট appName ব্যবহার করতে পারবেন।
- @InitBinder: এটি কন্ট্রোলারের জন্য ডাটা বাইন্ডিং কাস্টমাইজ করতে ব্যবহৃত হয়।
@ControllerAdvice
public class GlobalDataBinder {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), false));
}
}
এটি সমস্ত কন্ট্রোলারের জন্য ডাটা বাইন্ডিং কাস্টমাইজ করবে।
Spring Boot এ Global Exception Handling
Spring Boot অ্যাপ্লিকেশনে @ControllerAdvice ব্যবহার করে গ্লোবাল এক্সেপশন হ্যান্ডলিং খুবই সহজ এবং স্বয়ংক্রিয়ভাবে কাজ করে।
application.properties:
# Enable detailed error messages (optional)
server.error.whitelabel.enabled=false
এখানে Spring Boot এর WhitelabelErrorPage বন্ধ করে আপনি নিজের কাস্টম এক্সেপশন পেজ তৈরি করতে পারেন, যা @ControllerAdvice দ্বারা পরিচালিত হবে।
উপসংহার
@ControllerAdvice Spring MVC এবং Spring Boot অ্যাপ্লিকেশনে গ্লোবাল এক্সেপশন হ্যান্ডলিংয়ের জন্য একটি শক্তিশালী টুল। এটি @ExceptionHandler, @ModelAttribute, এবং @InitBinder অ্যানোটেশনগুলির মাধ্যমে অ্যাপ্লিকেশনের সমস্ত কন্ট্রোলার থেকে আসা এক্সেপশনগুলি একত্রে হ্যান্ডল করতে সহায়তা করে। এটি কোডের পুনরাবৃত্তি কমাতে, উন্নত ত্রুটি রিপোর্টিং এবং ইউজার-ফ্রেন্ডলি এক্সেপশন পেজ প্রদান করতে সহায়ক।
এটি একটি বড় প্রজেক্টের ক্ষেত্রে অত্যন্ত সহায়ক হতে পারে, কারণ এটি কেন্দ্রীয়ভাবে এক্সেপশনগুলি পরিচালনা এবং অ্যাপ্লিকেশনের ভিউগুলোকে নিয়ন্ত্রণ করে।
Read more