2012-01-04 1 views
5

Я сейчас работаю с интеграционной основой MyBatis-Spring, и вот что я прочитал из документации:MyBatis mapper вводится непосредственно в класс обслуживания. Как насчет исключений?

Вместо доступ к объектам Код данных (Daos) вручную с помощью SqlSessionDaoSupport или SqlSessionTemplate, Mybatis-Spring предоставляет прокси-завод : MapperFactoryBean. Этот класс позволяет вводить интерфейсы отображения данных непосредственно в сервисные компоненты. При использовании mappers вы просто называете их так, как вы всегда называли ваши DAO, но вам не нужно указывать какую-либо реализацию DAO, потому что MyBatis-Spring создаст прокси для вас.

Это очень приятная функция ... но как насчет обработки исключений? Где я должен переводить ошибки SQL? В моем сервисе? Но разве это не нарушало бы шаблоны службы-DAO?

Пример:

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); 
    } 

Можно ли перевести исключения в уровне услуг?

Как это сделать?

Заранее благодарим за консультацию.

ответ

6

Недавно использовав mybatis-spring для проекта, я наткнулся на тот же камень преткновения. Я также не хотел заманить класс обслуживания обработкой исключений DAO, особенно потому, что некоторые методы на моем уровне обслуживания требовали доступа только для чтения к множеству разных таблиц.

Решение, к которому я пришел, состояло в том, чтобы поймать исключения на уровне службы, но создать свой собственный тип исключения, который принимает исключение catch в качестве параметра. Это может затем отфильтровать, какое сообщение об ошибке должно содержаться, когда исключение фактически сконструировано, и удалить необходимость сопоставления строк (по крайней мере, в уровне обслуживания).

Вы находитесь рядом с ним, за исключением того, что AccountServiceException будет иметь конструктор, который принял параметр Exception e. Я также решил попробовать и сделать все мои данные доступ как можно раньше и обернуть все это в один try/catch. Поскольку MapperFactoryBean всегда переводит исключенные исключения в Spring DataAccessExceptions, вам не нужно беспокоиться о том, чтобы поймать другие виды исключений при доступе к данным.

Я смущаюсь рассматривать этот ответ как таковой - более общий опыт, учитывая, что я натолкнулся на это и тоже колебался.

+0

Очень хороший ответ! Благодаря! –

1

Перевод низкоуровневых данных DataAccessException, созданный MyBatis для приложений, определенных в уровне обслуживания, является стандартной практикой.

Обычно он связан с обработкой транзакций, поскольку вы не можете обрабатывать транзакцию, охватывающую несколько DAO в DA-слое.

Так что да, это нормально и даже рекомендуется.

Обычно я регистрирую исключения, отбрасываемые DAO в журнале ошибок, и реконструирует что-то определенное приложением.

Смежные вопросы