@ExceptionHandler এর ধারণা
@ExceptionHandler একটি Spring MVC এনোটেশন যা কাস্টমাইজড এক্সেপশন হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়। এটি একটি নির্দিষ্ট এক্সেপশন বা একাধিক এক্সেপশন ধরার জন্য কনট্রোলার ক্লাস বা এর মেথডে সংজ্ঞায়িত করা হয়।
বৈশিষ্ট্য:
- নির্দিষ্ট কনট্রোলারের জন্য কার্যকর।
- নির্দিষ্ট এক্সেপশন অনুযায়ী কাস্টম রেসপন্স প্রদান করতে সক্ষম।
@ControllerAdvice এর ধারণা
@ControllerAdvice Spring Framework-এর একটি গ্লোবাল এক্সেপশন হ্যান্ডলিং এনোটেশন, যা অ্যাপ্লিকেশনের সমস্ত কনট্রোলার ক্লাসের জন্য কমন এক্সেপশন হ্যান্ডলিং সরবরাহ করে। এটি একাধিক কনট্রোলার ক্লাসে একই এক্সেপশন হ্যান্ডলিং লজিক পুনরাবৃত্তি করা এড়ায়।
বৈশিষ্ট্য:
- গ্লোবাল লেভেলে কাজ করে।
- নির্দিষ্ট প্যাকেজ বা ক্লাসের জন্য এক্সেপশন হ্যান্ডলিং সীমাবদ্ধ করা যায়।
- @ExceptionHandler, @ModelAttribute, এবং @InitBinder সমর্থন করে।
@ExceptionHandler এর ব্যবহার
উদাহরণ: নির্দিষ্ট এক্সেপশন হ্যান্ডলিং
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
// যদি ব্যবহারকারী না পাওয়া যায়
throw new UserNotFoundException("User not found with id: " + id);
}
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}
}
@ControllerAdvice এর ব্যবহার
উদাহরণ: গ্লোবাল এক্সেপশন হ্যান্ডলিং
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleGeneralException(Exception ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("An error occurred: " + ex.getMessage());
}
}
@ExceptionHandler এবং @ControllerAdvice এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | @ExceptionHandler | @ControllerAdvice |
|---|---|---|
| সীমাবদ্ধতা | নির্দিষ্ট কনট্রোলারের জন্য কার্যকর। | গ্লোবাল বা নির্দিষ্ট প্যাকেজ/ক্লাসের জন্য কার্যকর। |
| পুনরাবৃত্তি | একাধিক কনট্রোলারে পুনরাবৃত্তি হতে পারে। | পুনরাবৃত্তি এড়াতে একটি কেন্দ্রীভূত হ্যান্ডলার। |
| লগিকের পুনরায় ব্যবহার | সীমিত। | সমস্ত কনট্রোলারে একই হ্যান্ডলিং লজিক প্রযোজ্য। |
কেন এই এনোটেশনগুলো প্রয়োজন?
- কোড পরিষ্কার ও সংগঠিত রাখে: নির্দিষ্ট এক্সেপশন বা গ্লোবাল লেভেলে এক্সেপশন হ্যান্ডলিং আলাদা রাখা যায়।
- কাস্টম রেসপন্স: ক্লায়েন্টের জন্য স্পষ্ট এবং প্রয়োজনমাফিক রেসপন্স তৈরি করা যায়।
- পুনরাবৃত্তি কমায়: একাধিক কনট্রোলারে একই লজিক পুনরায় লেখা থেকে মুক্তি দেয়।
- সহজ ডিবাগিং: এক্সেপশন হ্যান্ডলিং কেন্দ্রীয়ভাবে পরিচালনা করা যায়।
@ExceptionHandler এবং @ControllerAdvice এর বাস্তব ব্যবহার
স্টেপ ১: কাস্টম এক্সেপশন তৈরি করা
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message) {
super(message);
}
}
স্টেপ ২: গ্লোবাল হ্যান্ডলার তৈরি করা
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}
}
স্টেপ ৩: কনট্রোলারে এক্সেপশন থ্রো করা
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
if (id == null || id <= 0) {
throw new UserNotFoundException("User not found with id: " + id);
}
// ডামি ইউজার রিটার্ন করা
return new User(id, "John Doe", "john.doe@example.com");
}
}
সারাংশ
- @ExceptionHandler নির্দিষ্ট কনট্রোলারের এক্সেপশন হ্যান্ডলিং পরিচালনা করে।
- @ControllerAdvice সমস্ত কনট্রোলারের জন্য গ্লোবাল এক্সেপশন হ্যান্ডলিং নিশ্চিত করে।
- এই দুই এনোটেশন একত্রে ব্যবহার করলে অ্যাপ্লিকেশনের এক্সেপশন হ্যান্ডলিং আরও কার্যকর এবং সংগঠিত হয়।
Content added By
Read more