首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CDI在同一实例中调用带有拦截器注释的方法

CDI在同一实例中调用带有拦截器注释的方法
EN

Stack Overflow用户
提问于 2010-10-01 15:03:10
回答 3查看 2.8K关注 0票数 3

下面是我的DAO实现,我将加载整个表并在内存中缓存一段时间

代码语言:javascript
复制
@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);
   }

}

这是我的球衣客户

代码语言:javascript
复制
@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(),我将看到拦截器逻辑已执行

如果我调用内部调用loadAllTranslation()的dataAccessFacade.getTranslation(),那么我没有看到拦截器被执行

这里的问题是什么?

如何解决?

EN

回答 3

Stack Overflow用户

发布于 2011-09-16 17:55:00

这是CDI规范中的正确行为。只有“客户端”类调用的方法才被认为是“业务方法”,因此才会被拦截。

票数 2
EN

Stack Overflow用户

发布于 2014-06-19 14:49:55

只需在您的DataAccessFacade中执行以下操作:

代码语言:javascript
复制
@Inject
private Provider<DataAccessFacade> self;

public String getTranslation(String key) {
  return self.get().loadAllTranslation().get(key);
}
票数 1
EN

Stack Overflow用户

发布于 2010-10-06 06:09:55

绑定到类的拦截器将拦截所有方法。看起来您已经选择绑定拦截器(@CacheOutput?)到特定方法,而不是在类级别。

我想,如果除了loadAllTranslation之外,您还显式地将拦截器绑定到getTranslation方法,那么您将看到拦截器在这两种情况下都可以工作。

我没有在规范中找到任何解释来解释当前的行为。我的猜测是它可以被认为是一种封装(信息隐藏)。在外部,没有理由期望对getTranslation的调用会导致对loadAllTranslation的调用。如果拦截器是作为对getTranslation的调用的结果被调用的(没有显式注释),那么它可以被视为泄漏了类的内部工作细节。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3837118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档