下面是我的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(),那么我没有看到拦截器被执行
这里的问题是什么?
如何解决?
发布于 2011-09-16 17:55:00
这是CDI规范中的正确行为。只有“客户端”类调用的方法才被认为是“业务方法”,因此才会被拦截。
发布于 2014-06-19 14:49:55
只需在您的DataAccessFacade中执行以下操作:
@Inject
private Provider<DataAccessFacade> self;
public String getTranslation(String key) {
return self.get().loadAllTranslation().get(key);
}发布于 2010-10-06 06:09:55
绑定到类的拦截器将拦截所有方法。看起来您已经选择绑定拦截器(@CacheOutput?)到特定方法,而不是在类级别。
我想,如果除了loadAllTranslation之外,您还显式地将拦截器绑定到getTranslation方法,那么您将看到拦截器在这两种情况下都可以工作。
我没有在规范中找到任何解释来解释当前的行为。我的猜测是它可以被认为是一种封装(信息隐藏)。在外部,没有理由期望对getTranslation的调用会导致对loadAllTranslation的调用。如果拦截器是作为对getTranslation的调用的结果被调用的(没有显式注释),那么它可以被视为泄漏了类的内部工作细节。
https://stackoverflow.com/questions/3837118
复制相似问题