【问题标题】:CDI call interceptor annotated method within same instance同一实例中的 CDI 调用拦截器注释方法
【发布时间】:2011-04-19 17:21:50
【问题描述】:

这是我的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(),我会看到拦截器逻辑被执行了

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

这里有什么问题?

如何解决?

【问题讨论】:

    标签: jakarta-ee interceptor cdi


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      @Inject
      private Provider<DataAccessFacade> self;
      
      public String getTranslation(String key) {
        return self.get().loadAllTranslation().get(key);
      }
      

      【讨论】:

      • 如果我们不知道对象是如何注入的怎么办?它可能是一个子类,和/或它可能在注入点有限定符。有没有办法让客户看到相同的对象?
      【解决方案3】:

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

      我想,如果除了 loadAllTranslation 之外,您还明确地将拦截器绑定到 getTranslation 方法,那么您会看到拦截器在这两种情况下都有效。

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

      【讨论】:

      猜你喜欢
      • 2011-10-21
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 2011-06-11
      • 2020-06-17
      • 2018-09-26
      • 2014-03-10
      • 2018-09-04
      相关资源
      最近更新 更多