Аннотированный метод перехватчика вызова CDI в том же экземпляре - PullRequest
3 голосов
/ 01 октября 2010

вот моя реализация DAO, я загружу всю таблицу и кэширую в памяти в течение определенного периода времени

@ApplicationScoped
public class DataAccessFacade {

   @Inject
   private EntityManager em;

   @CacheOutput
   public Map<String, String> loadAllTranslation() {
      List<Translation> list = em.createQuery("select t from Translation t").getResultList();    
      Map<String, String> result = new HashMap<String, String>();
      // do more processing here, omitted for clarity     
      return result;
   }

   public String getTranslation(String key) {
      return loadAllTranslation().get(key);
   }

}

вот мой клиент-джерси

@Inject
DataAccessFacade dataAccessFacade;

@Path("/5")
@GET
@Produces(MediaType.TEXT_PLAIN)
public String t5(@QueryParam("id") String key) {
  // load the data from dataAccessFacade
  String text = dataAccessFacade.getTranslation(key); 
  String text2 = dataAccessFacade.loadAllTranslation().get(key); 
}

вклиент, если я вызову dataAccessFacade.loadAllTranslation (), я увижу, что логика перехватчика была выполнена

, если я вызову dataAccessFacade.getTranslation (), который внутренне вызывает loadAllTranslation (), то я не увидел перехватчикбыл выполнен

в чем здесь проблема?

как это решить?

Ответы [ 3 ]

2 голосов
/ 16 сентября 2011

Это правильное поведение, как в спецификации CDI. Только методы, вызываемые классами "client", считаются "бизнес-методами" и, таким образом, перехватываются.

1 голос
/ 19 июня 2014

просто сделайте следующее в вашей DataAccessFacade:

@Inject
private Provider<DataAccessFacade> self;

public String getTranslation(String key) {
  return self.get().loadAllTranslation().get(key);
}
0 голосов
/ 06 октября 2010

Перехватчик, связанный с классом, будет перехватывать все методы. Похоже, вы решили связать свой перехватчик (@CacheOutput?) С конкретными методами, а не на уровне класса.

Я предполагаю, что если вы явно привязали свой перехватчик к методу getTranslation в дополнение к loadAllTranslation, то вы увидите, что перехватчик работает в обеих ситуациях.

Я не нашел никакого объяснения в спецификации, чтобы объяснить текущее поведение. Я предполагаю, что это можно рассматривать как своего рода инкапсуляцию (скрытие информации). Внешне нет причин ожидать, что вызов getTranslation приведет к вызову loadAllTranslation. Если перехватчик должен вызываться в результате вызова getTranslation (без явной аннотации), это можно рассматривать как утечку сведений о внутренней работе класса.

...