我已经看到了各种各样的点点滴滴,但我要么接近这个错误,要么对 Guice 的理解有点不足。我正在尝试修改/扩展这个cache4guice Infinispan 模块 ,以便它可以访问 JBoss 嵌入式模块,并最终在选定的缓存容器中命名缓存。
因此,我们的standalone.xml 包含以下内容:
<cache-container name="InfinispanCacheModule" default-cache="cache1" jndi-name="java:jboss/infinispan/container/mycachecontainer>
<local-cache name="cache1">
<eviction strategy="LRU" max-entries="1000"/>
<expiration max-idle="50000"/>
<file-store preload="true" passivation="true" purge="false"/>
</local-cache>
<local-cache name="cache2">
<eviction strategy="LRU" max-entries="500"/>
<expiration max-idle="20000"/>
<file-store preload="true" passivation="false" purge="false"/>
</local-cache>
我已经修改了 @Cached 注释以允许可选地包含一个 cachedName 参数。您可以将其用于默认缓存的想法:
@Cached
public someMethod(String someArg) {...}
这用于访问 cache2 及以上...
@Cached(cacheName="cache2")
public someOtherMethod(String someArg) {...}
我发现似乎允许我访问事物的唯一示例是使用 jndi 资源,例如在此页面中 - ttp://my.safaribooksonline.com/book/web-development/ 9781590599976/guice-recipes/integrating_jndi
这导致我尝试这样的事情:
public class InfinispanCacheModule extends CacheModule {
...
@Override
protected void configure() {
// bind naming context to the default InitialContext
bind(Context.class).to(InitialContext.class);
bind(CacheContainer.class).toProvider(JndiIntegration.fromJndi(CacheContainer.class, "java:jboss/infinispan/container/mycachecontainer"));
bindInterceptor(Matchers.any(), Matchers.annotatedWith(Cached.class), new CacheInterceptor(this));
}
此外,从这里和其他地方的帖子来看,我似乎可能想使用@Provides 方法——沿着这些思路: https ://stackoverflow.com/a/8999548/880884 Guice:是否可以注入模块?
所以,现在我们进入细节,如果我们看一下原始的 InfinispanModule,我的想法是在模块创建时传入一个 CacheManager,或者以某种方式在模块内创建一个。
public class MyGuiceFactory {
private static final Injector inj = Guice.createInjector(
new SomeGuiceModule(),
new InfinispanCacheModule(---- what goes here? -----)
);
public static Injector getInjector() {
return inj;
}
}