2012-01-04 21 views
5

Tôi hiện đang làm việc với khuôn khổ hội nhập MyBatis-xuân và đó là những gì tôi đọc từ tài liệu:Trình ánh xạ MyBatis được tiêm trực tiếp vào lớp dịch vụ. Còn ngoại lệ thì sao?

Thay vì đối tượng truy cập dữ liệu mã (DAO) bằng tay sử dụng SqlSessionDaoSupport hoặc SqlSessionTemplate, Mybatis-Spring cung cấp một nhà máy Proxy : MapperFactoryBean. Lớp này cho phép bạn chèn các giao diện trình ánh xạ dữ liệu trực tiếp vào các bean dịch vụ của bạn. Khi sử dụng người lập bản đồ, bạn chỉ cần gọi cho họ là bạn đã luôn gọi số DAO của mình, nhưng bạn sẽ không cần mã bất kỳ triển khai DAO nào vì MyBatis-Spring sẽ tạo proxy cho bạn.

Đó là một tính năng rất hay ... nhưng về xử lý ngoại lệ thì sao? Tôi nên dịch các lỗi SQL ở đâu? Trong lớp dịch vụ của tôi? Nhưng nó sẽ không vi phạm các mẫu dịch vụ-DAO?

Ví dụ:

public final class AccountServiceImpl implements AccountService { 
(...) 
    private AccountMapper accountMapper; 
(...) 
    @Override 
    public void addAccount(Account account) throws AccountServiceException { 

     //Validating, processing, setting timestamps etc. 
     (...) 

     //Persistence: 
     int rowsAffected; 
     try { 
      rowsAffected = accountMapper.insertAccount(account); 
     } catch (Exception e) { 
      String msg = e.getMessage(); 
      if (msg.contains("accounts_pkey")) 
       throw new AccountServiceException("Username already exists!"); 
      if (msg.contains("accounts_email_key")) 
       throw new AccountServiceException("E-mail already exists!"); 
      throw new AccountServiceException(APP_ERROR); 
     } 

     LOG.debug("Rows affected: '{}'", rowsAffected); 

     if (rowsAffected != 1) 
      throw new AccountServiceException(APP_ERROR); 
    } 

Is it OK để dịch ngoại lệ trong lớp dịch vụ?

Làm cách nào để thực hiện?

Cảm ơn trước lời khuyên của bạn.

Trả lời

6

Có gần đây đã sử dụng mybatis-spring cho một dự án tôi đã đi qua cùng một trở ngại. Tôi cũng không muốn xả rác lớp dịch vụ của tôi với xử lý ngoại lệ DAO, đặc biệt vì một số phương thức trong lớp dịch vụ của tôi yêu cầu truy cập chỉ đọc vào nhiều bảng khác nhau.

Giải pháp mà tôi đã đến là để nắm bắt các ngoại lệ trong lớp dịch vụ nhưng tạo loại ngoại lệ của riêng bạn để có ngoại lệ bị bắt làm tham số. Điều này sau đó có thể lọc ra những loại thông báo lỗi nên được chứa khi ngoại lệ được thực sự xây dựng và loại bỏ sự cần thiết phải phù hợp với chuỗi (trong lớp dịch vụ ít nhất).

Bạn ở gần vị trí đó, ngoại trừ AccountServiceException sẽ có một hàm tạo lấy tham số Exception e làm tham số. Tôi cũng đã chọn thử và thực hiện tất cả truy cập dữ liệu của mình càng sớm càng tốt và quấn tất cả trong một lần thử/nắm bắt đơn lẻ. Vì MapperFactoryBean luôn dịch các ngoại lệ được ném vào Spring DataAccessExceptions, bạn không phải lo lắng về việc bắt các loại ngoại lệ khác khi thực hiện truy cập dữ liệu.

Tôi do dự xem đây là câu trả lời như vậy - nhiều chia sẻ trải nghiệm hơn cho tôi và cũng do dự.

+0

Câu trả lời rất hay! Cảm ơn! –

1

Dịch các DataAccessExceptions cấp thấp được MyBatis đưa vào các ứng dụng được xác định trong lớp dịch vụ là một thực hành tiêu chuẩn.

Nó thường được kết nối với xử lý giao dịch vì bạn không thể xử lý giao dịch trải rộng nhiều DAO trong lớp DA.

Vì vậy, có, đó là OK và thậm chí được đề nghị.

Thông thường tôi đăng nhập ngoại lệ do DAO ném vào nhật ký lỗi và tìm lại thứ gì đó do ứng dụng xác định.

Các vấn đề liên quan