[英]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.