2015-05-15 3 views
1

У меня есть следующий фрагмент класса, из которого я хотел бы удалить повторяющийся код ведения журнала и перенести его в Interceptor с помощью AOP CDI.Перехват Исключения для регистрации с AOP на CDI в Java EE 7

/** 
* Javadoc omitted 
*/ 
public abstract class JpaDao<T extends LongIdentifiable> implements 
     GenericDao<T> { 

    @Override 
    @Transactional 
    public Long persist(T type) throws GeneralPersistenceException { 
     if (type == null) { 
      throw new GeneralPersistenceException("Can't persist null"); 
     } 

     try { 
      entityManager.persist(type); 
      return type.getId(); 
     } catch (PersistenceException e) { 
      String message = "Failed to persist an entity"; 
      logger.error(message, e); 
      throw new GeneralPersistenceException(message, e); 
     } 

    } 

    @Override 
    @Transactional 
    public T merge(T type) throws GeneralPersistenceException { 
     if (type == null) { 
      throw new GeneralPersistenceException("Can't merge null"); 
     } 

     try { 
      T mergedType = entityManager.merge(type); 
      return mergedType; 
     } catch (PersistenceException e) { 
      String message = "Failed to merge an entity"; 
      logger.error(message, e); 
      throw new GeneralPersistenceException(message, e); 
     } 
    } 
} 

Обратите внимание на фрагмент кода ниже, который повторяется в persist е merge методы

} catch (PersistenceException e) { 
    String message = "Failed to persist an entity"; 
    logger.error(message, e); 
    throw new GeneralPersistenceException(message, e); 
} 

кандидат код, чтобы заменить фрагмент кода выше, является следующее:

} catch (PersistenceException e) { 
    throw new GeneralPersistenceException("Failed to persist an entity", e); 
} 

Другими словами, Мне бы хотелось, чтобы каждый раз, когда вызывается GeneralPersistenceException, записывается сообщение журнала. Мое исключение:

public class GeneralPersistenceException extends Exception { 
    private static final long serialVersionUID = -6057737927996676949L; 

    public GeneralPersistenceException() { 
    } 

    public GeneralPersistenceException(String message) { 
     super(message); 
    } 

    public GeneralPersistenceException(String message, Throwable cause) { 
     super(message, cause); 
    } 

    public GeneralPersistenceException(Throwable cause) { 
     super(cause); 
    } 
} 

Как вы могли видеть, в Exception есть только конструкторы. Учитывая этот сценарий, у меня есть следующие вопросы:

  1. Лучшая стратегия, чтобы решить эту проблему, в совместимом приложении Java EE 7, использует АОП с CDI?
  2. В случае, если это АОП, следует ли перехватить GeneralPersistenceException?
  3. Возможно ли перехватить конструкторы GeneralPersistenceException или только методы (которые еще не существуют)?
  4. Есть ли что-то уже для этой цели, и я изобретаю колесо?

Заранее спасибо.

+0

Возможно, что Exception Control от DeltaSpike - это то, что вы ищете? http://deltaspike.apache.org/documentation/core.html#ExceptionControl –

+1

Это хорошая альтернатива, но это не то, что я ищу. Я действительно хочу предоставить такую ​​обработку исключений, используя AOP CDI или все, что уже предоставлено спецификацией Java EE. –

+0

Ваш вопрос: «Что-то уже реализовано для этой цели, и я изобретаю колесо?» Я просто указал на существующее колесо для вас. –

ответ

1

Вы не можете перехватывать исключение, так как оно создано с помощью ** new *, и оно не будет управляться CDI. И на практике вы не должны перехватывать таким образом. Решение, которое вы ищете, - это перехватить вызовы в вашем сервисе, поймать там свое исключение и занести его в журнал.

+0

'И на практике вы не должны перехватывать таким образом'. @win_wave, не могли бы вы объяснить, почему? –

+0

Перехваченные объекты должны управляться CDI, вы не можете этого избежать. CDI создает объекты в определенных областях, но экземпляр Exception должен жить только время от его метания до его улова. Для управления этим CDI нет необходимости или использовать его. Я думаю, что исключение должно быть как можно более легким. –

+0

Достаточно честный. Я буду работать над предлагаемым решением. Спасибо @win_wave. –

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