簡體   English   中英

CDI在同一實例中調用攔截器注釋方法

[英]CDI call interceptor annotated method within same instance

這是我的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(),那么我沒有看到攔截器被執行

這里有什么問題?

怎么解決?

這是CDI規范中的正確行為。 只有“客戶”類調用的方法才被視為“業務方法”,因此被截獲。

只需在DataAccessFacade中執行以下操作:

@Inject
private Provider<DataAccessFacade> self;

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

綁定到類的攔截器將攔截所有方法。 看起來您已選擇將攔截器(@CacheOutput?)綁定到特定方法而不是類級別。

我想如果除了loadAllTranslation之外你明確地將你的攔截器綁定到getTranslation方法,那么你會看到攔截器在這兩種情況下工作。

我在規范中沒有找到任何解釋來解釋當前的行為。 我的猜測是它可以被認為是一種封裝(信息隱藏)。 在外部,沒有理由期望調用getTranslation會導致調用loadAllTranslation。 如果作為調用getTranslation(沒有顯式注釋)的結果調用攔截器,則可以將其視為泄漏類的內部工作的細節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM