Spring ORM এ Exception Handling

Java Technologies - স্প্রিং ওআরএম (Spring ORM)
107
107

স্প্রিং ORM (Spring ORM) ডেটাবেস অপারেশন পরিচালনার জন্য Hibernate বা JPA এর মতো টুলগুলো ব্যবহার করে। ডেটাবেস অপারেশন করার সময় বিভিন্ন ধরনের ব্যতিক্রম (Exception) ঘটতে পারে, যেমন ডেটাবেস কানেকশন সমস্যা, কুয়েরি ত্রুটি, বা ডেটা ইন্টিগ্রিটির সমস্যা। স্প্রিং ফ্রেমওয়ার্কে একটি কার্যকর Exception Handling মেকানিজম রয়েছে, যা ডেভেলপারদের ব্যতিক্রমগুলো সহজে পরিচালনা করতে সাহায্য করে।


স্প্রিং ORM এ Exception Handling এর প্রয়োজনীয়তা

  • ডেটাবেসের সাথে কাজ করার সময় Checked Exceptions এবং Unchecked Exceptions ঘটতে পারে।
  • Hibernate এবং JPA ব্যতিক্রমগুলোকে RuntimeException এ রূপান্তর করার ক্ষমতা রাখে।
  • স্প্রিং ORM একটি একক DataAccessException শ্রেণী সরবরাহ করে, যা ব্যতিক্রমগুলিকে সমানভাবে পরিচালনা করতে সাহায্য করে।

DataAccessException শ্রেণী

স্প্রিং ফ্রেমওয়ার্কে DataAccessException হলো একটি শীর্ষস্থানীয় ব্যতিক্রম শ্রেণী। এটি স্প্রিং ORM বা ডেটাবেস অপারেশনের সময় সংঘটিত ব্যতিক্রমগুলিকে সমন্বিতভাবে হ্যান্ডেল করার সুযোগ দেয়।

সাধারণ DataAccessException উপশ্রেণীসমূহ

ব্যতিক্রমবর্ণনা
CannotCreateTransactionExceptionলেনদেন (Transaction) তৈরি করতে ব্যর্থ হলে।
DataIntegrityViolationExceptionডেটার অখণ্ডতা লঙ্ঘন হলে (যেমন ডুপ্লিকেট কি বা ফোরেন কী ভঙ্গ)।
DuplicateKeyExceptionডুপ্লিকেট কী ইনসার্ট করতে চেষ্টা করলে।
EmptyResultDataAccessExceptionকুয়েরির ফলাফল শূন্য হলে।
IncorrectResultSizeDataAccessExceptionকুয়েরি একাধিক বা অপ্রত্যাশিত সংখ্যক রেকর্ড ফেরত দিলে।

Spring ORM এ Exception Handling বাস্তবায়ন

ট্রানজেকশন ম্যানেজমেন্ট সহ Exception Handling

স্প্রিং এর @Transactional অ্যানোটেশন ব্যবহার করে ট্রানজেকশন পরিচালনার সময় Exception Handling করা যায়:

@Service
public class EmployeeService {

    @Autowired
    private EmployeeRepository employeeRepository;

    @Transactional
    public Employee saveEmployee(Employee employee) {
        try {
            return employeeRepository.save(employee);
        } catch (DataIntegrityViolationException e) {
            throw new CustomDatabaseException("Data integrity violation while saving employee.", e);
        } catch (Exception e) {
            throw new GeneralDatabaseException("An unexpected error occurred.", e);
        }
    }
}

Custom Exception ব্যবহার

Custom Exception তৈরি করে আরও বিস্তারিত ব্যতিক্রম ম্যানেজমেন্ট করা যায়:

Custom Exception তৈরি

public class CustomDatabaseException extends RuntimeException {
    public CustomDatabaseException(String message, Throwable cause) {
        super(message, cause);
    }
}

public class GeneralDatabaseException extends RuntimeException {
    public GeneralDatabaseException(String message, Throwable cause) {
        super(message, cause);
    }
}

REST API তে Exception Handling

@ControllerAdvice এবং @ExceptionHandler ব্যবহার করে REST API স্তরে ব্যতিক্রম পরিচালনা করা যায়:

Exception Handler ক্লাস

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(CustomDatabaseException.class)
    public ResponseEntity<String> handleCustomDatabaseException(CustomDatabaseException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.CONFLICT);
    }

    @ExceptionHandler(GeneralDatabaseException.class)
    public ResponseEntity<String> handleGeneralDatabaseException(GeneralDatabaseException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }

    @ExceptionHandler(DataAccessException.class)
    public ResponseEntity<String> handleDataAccessException(DataAccessException ex) {
        return new ResponseEntity<>("Database error: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
    }
}

HibernateException রূপান্তর করা

Hibernate এর ব্যতিক্রমগুলোকে Spring এর DataAccessException এ রূপান্তর করার জন্য HibernateTemplate বা HibernateTransactionManager ব্যবহার করা হয়। উদাহরণস্বরূপ:

@Repository
public class EmployeeDao {

    @Autowired
    private HibernateTemplate hibernateTemplate;

    public Employee getEmployeeById(Long id) {
        try {
            return hibernateTemplate.get(Employee.class, id);
        } catch (DataAccessException e) {
            throw new CustomDatabaseException("Error retrieving employee by ID.", e);
        }
    }
}

Best Practices

  1. Custom Exception ব্যবহার করে নির্দিষ্ট সমস্যাগুলো চিহ্নিত করুন।
  2. Global Exception Handling ব্যবহার করে কোডের পুনরাবৃত্তি এড়ান।
  3. DataAccessException শ্রেণী ব্যবহার করে Hibernate এবং JPA ব্যতিক্রমগুলিকে একত্রিত করুন।
  4. স্প্রিং এর @Transactional অ্যানোটেশন ব্যবহার করে স্বয়ংক্রিয় ট্রানজেকশন রোলব্যাক নিশ্চিত করুন।

সারাংশ

Spring ORM এ Exception Handling ডেটাবেস অপারেশনের সময় সংঘটিত ব্যতিক্রমগুলোকে সুনির্দিষ্ট ও সহজভাবে ম্যানেজ করার উপায় প্রদান করে। স্প্রিং এর DataAccessException শ্রেণী Hibernate এবং JPA ব্যতিক্রমগুলোকে সহজে হ্যান্ডেল করার সুযোগ দেয়। Custom Exception এবং Global Exception Handling ব্যবহার করে ডেটাবেস সম্পর্কিত ত্রুটিগুলো আরও কার্যকরভাবে মোকাবেলা করা যায়।

Content added By

Spring ORM এ Exception Handling এর প্রয়োজনীয়তা

72
72

Spring ORM-এর সাহায্যে ডাটাবেসের সঙ্গে কাজ করার সময় অনেক ধরনের ত্রুটি (Exception) ঘটতে পারে, যেমন ডাটাবেস কানেকশন সমস্যা, ডেটা ইনসার্ট বা আপডেট সমস্যা, ট্রানজেকশন ম্যানেজমেন্ট সমস্যা ইত্যাদি। এই ত্রুটিগুলো সঠিকভাবে পরিচালনা না করলে অ্যাপ্লিকেশন ক্র্যাশ করতে পারে এবং ব্যবহারকারীর অভিজ্ঞতা ক্ষতিগ্রস্ত হয়। Exception Handling এর মাধ্যমে এই ত্রুটিগুলো সঠিকভাবে শনাক্ত এবং সমাধান করা যায়।


Exception Handling এর প্রয়োজনীয়তা

১. ত্রুটি শনাক্তকরণ ও সমাধান

Spring ORM এর মাধ্যমে ডাটাবেস সংক্রান্ত ত্রুটিগুলো সহজে চিহ্নিত করা যায় এবং সঠিক সমাধানের ব্যবস্থা নেওয়া যায়।

২. ডাটাবেস অখণ্ডতা রক্ষা

Exception Handling এর মাধ্যমে ডাটাবেস ট্রানজেকশন ঠিকমতো Rollback করা যায়, যা ডাটাবেস অখণ্ডতা (Integrity) নিশ্চিত করে।

৩. ব্যবহারকারীর জন্য বন্ধুসুলভ বার্তা প্রদর্শন

Exception Handling এর মাধ্যমে জটিল ত্রুটি বার্তা এড়িয়ে ব্যবহারকারীর জন্য সহজ ও বোধগম্য বার্তা প্রদর্শন করা যায়।

৪. অ্যাপ্লিকেশনের স্থিতিশীলতা

ত্রুটিগুলো সঠিকভাবে পরিচালনা করলে অ্যাপ্লিকেশন ক্র্যাশ হওয়া থেকে রক্ষা পায় এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত হয়।

৫. Spring Framework-এর সুবিধা ব্যবহার

Spring ORM এর DataAccessException ক্লাস ORM ত্রুটি এবং JDBC ত্রুটিগুলোর জন্য একটি অভিন্ন (Uniform) এক্সসেপশন হ্যান্ডলিং সিস্টেম প্রদান করে।


Spring ORM এ Exception Handling কিভাবে কাজ করে?

Spring ORM-এর মাধ্যমে ত্রুটি পরিচালনার জন্য Spring Framework নিম্নলিখিত পদ্ধতিগুলো সরবরাহ করে:

১. DataAccessException

Spring এর DataAccessException একটি অবজেক্টিভ হায়ারার্কি যা Hibernate বা JPA থেকে আসা নিম্ন স্তরের ত্রুটিগুলোকে একীভূত (Unified) করে। এটি চেইন অফ এক্সসেপশন ব্যবহার করে রুট কজ নির্ধারণ করতে সাহায্য করে।

২. Transactional Rollback

Spring ORM Exception Handling ট্রানজেকশন ব্যর্থ হলে @Transactional অ্যানোটেশন ব্যবহার করে স্বয়ংক্রিয়ভাবে Rollback সম্পন্ন করে।

৩. Custom Exception Handling

Spring ORM এ ডেভেলপাররা নিজেদের কাস্টম এক্সসেপশন তৈরি করে নির্দিষ্ট ত্রুটি পরিচালনা করতে পারেন।


উদাহরণ: Exception Handling Spring ORM-এ

DAO ক্লাসে Exception Handling

@Repository
public class EmployeeDao {

    @Autowired
    private SessionFactory sessionFactory;

    public void saveEmployee(Employee employee) {
        try {
            Session session = sessionFactory.getCurrentSession();
            session.save(employee);
        } catch (DataAccessException e) {
            throw new RuntimeException("Failed to save employee: " + e.getMessage(), e);
        }
    }

    public Employee getEmployeeById(Long id) {
        try {
            Session session = sessionFactory.getCurrentSession();
            return session.get(Employee.class, id);
        } catch (DataAccessException e) {
            throw new RuntimeException("Failed to fetch employee: " + e.getMessage(), e);
        }
    }
}

সার্ভিস ক্লাসে Exception Handling

@Service
@Transactional
public class EmployeeService {

    @Autowired
    private EmployeeDao employeeDao;

    public void saveEmployee(Employee employee) {
        try {
            employeeDao.saveEmployee(employee);
        } catch (RuntimeException e) {
            System.err.println("Error saving employee: " + e.getMessage());
            throw e;
        }
    }

    public Employee getEmployeeById(Long id) {
        try {
            return employeeDao.getEmployeeById(id);
        } catch (RuntimeException e) {
            System.err.println("Error fetching employee: " + e.getMessage());
            throw e;
        }
    }
}

Custom Exception তৈরি

public class EmployeeNotFoundException extends RuntimeException {
    public EmployeeNotFoundException(String message) {
        super(message);
    }
}

Custom Exception ব্যবহার

public Employee getEmployeeById(Long id) {
    Employee employee = employeeDao.getEmployeeById(id);
    if (employee == null) {
        throw new EmployeeNotFoundException("Employee not found with id: " + id);
    }
    return employee;
}

Controller এ Exception Handling

Spring MVC-তে @ControllerAdvice ব্যবহার করে Exception হ্যান্ডল করা যায়:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(EmployeeNotFoundException.class)
    public ResponseEntity<String> handleEmployeeNotFoundException(EmployeeNotFoundException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleGenericException(Exception ex) {
        return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

সারাংশ

Spring ORM-এ Exception Handling অত্যন্ত গুরুত্বপূর্ণ কারণ এটি ডাটাবেস ত্রুটি, ট্রানজেকশন ব্যর্থতা এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে সহায়তা করে। Spring Framework-এর DataAccessException এবং @Transactional অ্যানোটেশনের মাধ্যমে Exception Handling আরও সহজ এবং কার্যকর করা যায়। Custom Exception এবং Global Exception Handling যোগ করে অ্যাপ্লিকেশনের স্থায়িত্ব ও মান বৃদ্ধি করা যায়।

Content added By

Hibernate এবং JPA এর Common Exceptions

109
109

Hibernate এবং JPA ব্যবহারের সময় ডাটাবেজ অপারেশনে বিভিন্ন ধরণের এক্সসেপশন (Exceptions) ঘটে। এই এক্সসেপশনগুলো বুঝে সঠিকভাবে হ্যান্ডল করা গুরুত্বপূর্ণ। Hibernate এবং JPA নিজস্ব এক্সসেপশন হিয়ারার্কি ব্যবহার করে যা ডেভেলপারদের জন্য ডিবাগিং সহজ করে।


Hibernate এবং JPA এর প্রধান এক্সসেপশন

1. LazyInitializationException

  • কেন ঘটে: Lazy loading সক্রিয় থাকলে এবং Hibernate সেশনের বাইরে অ্যাক্সেস করার চেষ্টা করলে।
  • উদাহরণ:
User user = session.get(User.class, userId);
session.close();
System.out.println(user.getOrders().size()); // LazyInitializationException
  • সমাধান:
    • FetchType.EAGER ব্যবহার করা।
    • Hibernate সেশন ব্যবহারের সময় lazy-loaded ডেটা অ্যাক্সেস করা।
    • Spring-এ OpenSessionInView প্যাটার্ন ব্যবহার।

2. NonUniqueResultException

  • কেন ঘটে: কোয়েরি একাধিক রেকর্ড রিটার্ন করে, অথচ কোয়েরি থেকে একক রেকর্ড প্রত্যাশা করা হয়।
  • উদাহরণ:
Query query = session.createQuery("FROM User WHERE email = :email");
query.setParameter("email", "john.doe@example.com");
User user = (User) query.getSingleResult(); // NonUniqueResultException
  • সমাধান:
    • getResultList() ব্যবহার করে লিস্ট রিটার্ন করা।
    • নিশ্চিত করা যে কোয়েরি শুধুমাত্র একটি রেকর্ড রিটার্ন করবে।

3. ConstraintViolationException

  • কেন ঘটে: ডাটাবেস কনস্ট্রেইন্ট (Constraint) ভঙ্গ করা হলে।
  • উদাহরণ:
    • Primary Key ডুপ্লিকেট করা।
    • Unique কনস্ট্রেইন্ট ভঙ্গ করা।
User user = new User();
user.setId(1); // ID already exists
session.save(user); // ConstraintViolationException
  • সমাধান:
    • ডেটা ইনপুট করার আগে ডুপ্লিকেট চেক করা।
    • ডাটাবেস সঠিকভাবে ডিজাইন করা।

4. EntityNotFoundException

  • কেন ঘটে: getReference() ব্যবহার করে কোনো Entity পাওয়া না গেলে।
  • উদাহরণ:
User user = session.getReference(User.class, invalidId); // EntityNotFoundException
  • সমাধান:
    • get() ব্যবহার করা, যা null রিটার্ন করে।
    • ডাটাবেসে Entity আছে কি না তা নিশ্চিত করা।

5. StaleObjectStateException

  • কেন ঘটে: Optimistic Locking ভঙ্গ করলে।
  • উদাহরণ:
User user1 = session.get(User.class, userId);
User user2 = session.get(User.class, userId);
user1.setName("User 1");
session.update(user1);
user2.setName("User 2");
session.update(user2); // StaleObjectStateException
  • সমাধান:
    • @Version এনোটেশন ব্যবহার করে Entity-তে ভার্সনিং যোগ করা।

6. TransactionRequiredException

  • কেন ঘটে: ডেটা পরিবর্তনের জন্য Hibernate বা JPA ট্রান্সাকশন শুরু করা হয়নি।
  • উদাহরণ:
session.save(user); // TransactionRequiredException
  • সমাধান:
    • Transaction শুরু করার জন্য Spring-এ @Transactional ব্যবহার করা।

7. QuerySyntaxException

  • কেন ঘটে: HQL/JPQL কোয়েরিতে সিনট্যাক্সগত ত্রুটি থাকলে।
  • উদাহরণ:
Query query = session.createQuery("FROM Users"); // Incorrect table name
  • সমাধান:
    • কোয়েরি সঠিকভাবে লিখুন।
    • HQL/JPQL এর সিনট্যাক্স মেনে চলুন।

8. PersistentObjectException

  • কেন ঘটে: Hibernate সেশনের বাইরের অবজেক্টে পরিবর্তন আনতে গেলে।
  • উদাহরণ:
User user = new User();
session.update(user); // PersistentObjectException
  • সমাধান:
    • Hibernate সেশনে অবজেক্ট অ্যাটাচ করা।

9. DataIntegrityViolationException

  • কেন ঘটে: ডেটাবেসের Integrity কনস্ট্রেইন্ট ভঙ্গ হলে।
  • উদাহরণ:
    • Foreign Key কনস্ট্রেইন্ট ভঙ্গ।
Order order = new Order();
order.setUser(null); // Null Foreign Key
session.save(order); // DataIntegrityViolationException
  • সমাধান:
    • ডাটাবেসে Integrity কনস্ট্রেইন্ট চেক করা এবং মান সঠিকভাবে সেট করা।

10. OptimisticLockException

  • কেন ঘটে: একাধিক ব্যবহারকারী একই Entity-তে একসাথে পরিবর্তন করার চেষ্টা করলে।
  • উদাহরণ:
User user1 = session1.get(User.class, userId);
User user2 = session2.get(User.class, userId);
user1.setName("User 1");
session1.update(user1);
user2.setName("User 2");
session2.update(user2); // OptimisticLockException
  • সমাধান:
    • @Version ব্যবহার করে Optimistic Locking সক্রিয় করা।

Hibernate এবং JPA এক্সসেপশন হ্যান্ডলিং এর সেরা পদ্ধতি

  1. Proper Logging: এক্সসেপশন লগ করে সঠিক কারণ নির্ণয় করুন।
  2. Spring Exception Translation: @Repository এনোটেশন ব্যবহার করলে HibernateException গুলো Spring এর DataAccessException এ কনভার্ট হয়।
  3. Validation: ইনপুট ডেটা সঠিকভাবে যাচাই করা।
  4. Transactions: সঠিকভাবে ট্রান্সাকশন ব্যবস্থাপনা করা।
  5. Unit Tests: কোডে এক্সসেপশন পরিস্থিতি সিমুলেট করে টেস্ট করা।

Hibernate এবং JPA তে কমন এক্সসেপশনগুলি সম্পর্কে ধারণা এবং সেগুলোর সঠিক ব্যবস্থাপনা ডেটাবেস অপারেশনগুলোকে আরো কার্যকর করে তোলে।

Content added By

@ExceptionHandler এবং @ControllerAdvice এর ব্যবহার

67
67

@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
সীমাবদ্ধতানির্দিষ্ট কনট্রোলারের জন্য কার্যকর।গ্লোবাল বা নির্দিষ্ট প্যাকেজ/ক্লাসের জন্য কার্যকর।
পুনরাবৃত্তিএকাধিক কনট্রোলারে পুনরাবৃত্তি হতে পারে।পুনরাবৃত্তি এড়াতে একটি কেন্দ্রীভূত হ্যান্ডলার।
লগিকের পুনরায় ব্যবহারসীমিত।সমস্ত কনট্রোলারে একই হ্যান্ডলিং লজিক প্রযোজ্য।

কেন এই এনোটেশনগুলো প্রয়োজন?

  1. কোড পরিষ্কার ও সংগঠিত রাখে: নির্দিষ্ট এক্সেপশন বা গ্লোবাল লেভেলে এক্সেপশন হ্যান্ডলিং আলাদা রাখা যায়।
  2. কাস্টম রেসপন্স: ক্লায়েন্টের জন্য স্পষ্ট এবং প্রয়োজনমাফিক রেসপন্স তৈরি করা যায়।
  3. পুনরাবৃত্তি কমায়: একাধিক কনট্রোলারে একই লজিক পুনরায় লেখা থেকে মুক্তি দেয়।
  4. সহজ ডিবাগিং: এক্সেপশন হ্যান্ডলিং কেন্দ্রীয়ভাবে পরিচালনা করা যায়।

@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

উদাহরণ সহ Exception Handling

76
76

Spring ORM-এ Exception Handling ডেটাবেস অপারেশন চলাকালীন ত্রুটি নির্ণয় এবং এর যথাযথ সমাধান প্রদানে গুরুত্বপূর্ণ ভূমিকা পালন করে। Spring Framework ডেটাবেস অপারেশনের জন্য নির্দিষ্ট DataAccessException এবং এর সাব-ক্লাস সরবরাহ করে, যা SQL বা Hibernate ত্রুটিকে আরও সাধারণ এবং সুনির্দিষ্ট রূপে প্রকাশ করে।


Spring ORM-এ Exception Handling কিভাবে কাজ করে?

Spring এর DataAccessException একটি Runtime Exception, যা ডেভেলপারদের Checked Exception ব্যবহার না করেও ত্রুটি পরিচালনা করতে দেয়। Spring ORM Hibernate, JPA, বা JDBC থেকে আসা ত্রুটিগুলোকে DataAccessException-এ রূপান্তর করে।

DataAccessException-এর কিছু সাধারণ সাব-ক্লাস:

  • DuplicateKeyException: ডুপ্লিকেট প্রাইমারি কি বা ইউনিক কনস্ট্রেইন্ট ভায়োলেশন।
  • DataIntegrityViolationException: ডেটার ইনটিগ্রিটি লঙ্ঘন।
  • QueryTimeoutException: কুয়েরি টাইম আউট হলে।
  • CannotAcquireLockException: ডাটাবেস লক না পেলে।

উদাহরণ: Spring ORM-এ Exception Handling

১. Maven Dependency (Spring ORM এবং Hibernate):

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>5.3.10</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.5.7.Final</version>
</dependency>

২. Entity Class:

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String position;

    // Getters এবং Setters
}

৩. DAO Layer:

@Repository
public class EmployeeDao {

    @Autowired
    private SessionFactory sessionFactory;

    public void saveEmployee(Employee employee) {
        try {
            Session session = sessionFactory.getCurrentSession();
            session.save(employee);
        } catch (DataIntegrityViolationException e) {
            throw new RuntimeException("Data integrity violation: " + e.getMessage(), e);
        } catch (Exception e) {
            throw new RuntimeException("Unknown error occurred: " + e.getMessage(), e);
        }
    }

    public Employee findEmployeeById(Long id) {
        try {
            Session session = sessionFactory.getCurrentSession();
            return session.get(Employee.class, id);
        } catch (Exception e) {
            throw new RuntimeException("Error fetching employee: " + e.getMessage(), e);
        }
    }
}

৪. Service Layer:

@Service
public class EmployeeService {

    @Autowired
    private EmployeeDao employeeDao;

    public void createEmployee(Employee employee) {
        try {
            employeeDao.saveEmployee(employee);
        } catch (DuplicateKeyException e) {
            System.out.println("Duplicate key error: " + e.getMessage());
        } catch (DataAccessException e) {
            System.out.println("Data access error: " + e.getMessage());
        } catch (Exception e) {
            System.out.println("General error: " + e.getMessage());
        }
    }

    public Employee getEmployee(Long id) {
        try {
            return employeeDao.findEmployeeById(id);
        } catch (Exception e) {
            System.out.println("Error fetching employee: " + e.getMessage());
            return null;
        }
    }
}

Exception Handling-এর বেস্ট প্র্যাকটিস

  1. সুনির্দিষ্ট Exception ধরা: যেমন DuplicateKeyException বা DataIntegrityViolationException
  2. Custom Exception তৈরি করা: Exception Handling আরও স্পষ্ট এবং ডিবাগিং সহজ করতে।
  3. লগ ব্যবহার করা: ত্রুটিগুলো লগ ফাইলের মাধ্যমে মনিটর করতে।
  4. Transaction Management নিশ্চিত করা: Exception হলে ডেটাবেস স্টেট রোলব্যাক করার জন্য।

Custom Exception উদাহরণ:

public class EmployeeNotFoundException extends RuntimeException {
    public EmployeeNotFoundException(String message) {
        super(message);
    }
}
public Employee getEmployee(Long id) {
    try {
        Employee employee = employeeDao.findEmployeeById(id);
        if (employee == null) {
            throw new EmployeeNotFoundException("Employee not found with ID: " + id);
        }
        return employee;
    } catch (EmployeeNotFoundException e) {
        System.out.println(e.getMessage());
        return null;
    }
}

Spring ORM-এর Exception Handling ডেটাবেস সংক্রান্ত ত্রুটিগুলো সুনির্দিষ্টভাবে শনাক্ত এবং সমাধান করতে সাহায্য করে। এর মাধ্যমে অ্যাপ্লিকেশনের স্থিতিশীলতা এবং ডিবাগিং প্রক্রিয়া সহজ হয়।


Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion