Javax @Resource无法注入Standalone.xml中Infinispan管理器问题排查
WildFly 26 + Java 17 下 Infinispan EmbeddedCacheManager 注入空指针问题解决建议
以下是针对你遇到的注入空指针问题的具体排查和解决步骤:
1. 确保JAX-RS资源类被容器托管
@Resource注解的注入依赖容器对类的托管,你的TestInjection作为JAX-RS资源类,需要添加CDI作用域注解让容器识别并处理注入逻辑:
import javax.enterprise.context.RequestScoped; import javax.annotation.Resource; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import org.infinispan.manager.EmbeddedCacheManager; @Path("/testInjection") @RequestScoped // 添加CDI作用域注解 public class TestInjection { @Resource(name = "java:jboss/infinispan/container/cacheContainer") private EmbeddedCacheManager CACHE_MANAGER; // 原有方法... }
WildFly自带CDI实现,无需额外引入依赖(scope保持provided即可)。
2. 验证JNDI名称有效性
通过WildFly CLI命令确认目标JNDI绑定是否存在:
# 连接到WildFly服务器后执行 /subsystem=naming/binding=java\:jboss\/infinispan\/container\/cacheContainer:read-resource
如果返回资源不存在,检查standalone.xml中缓存容器的名称是否拼写正确,或者容器是否未正常启动。
3. 修正Infinispan依赖配置
确保只引入Infinispan API依赖且scope为provided(避免与WildFly内置实现冲突):
<dependency> <groupId>org.infinispan</groupId> <artifactId>infinispan-api</artifactId> <scope>provided</scope> </dependency> <!-- 保留原有@Resource注解依赖 --> <dependency> <groupId>org.jboss.spec.javax.annotation</groupId> <artifactId>jboss-annotations-api_1.3_spec</artifactId> <scope>provided</scope> </dependency>
不要引入infinispan-core等实现类依赖,否则会引发类加载冲突导致注入失败。
4. 尝试CDI注入替代@Resource
WildFly官方推荐使用CDI注入方式,可靠性更高:
import javax.inject.Inject; import javax.enterprise.context.RequestScoped; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import org.infinispan.manager.EmbeddedCacheManager; import org.jboss.as.clustering.infinispan.annotation.CacheContainer; @Path("/testInjection") @RequestScoped public class TestInjection { @Inject @CacheContainer("cacheContainer") // 指定缓存容器名称 private EmbeddedCacheManager cacheManager; @GET @Produces(MediaType.APPLICATION_JSON) @Path("/api/versioninfo") public void getVersionInfo() { if(cacheManager != null) { System.err.println("positive"); }else { System.err.println("cache manager null"); } } }
5. 完善缓存容器配置
补充standalone.xml中缓存容器的必要配置,确保容器正常初始化:
<subsystem xmlns="urn:jboss:domain:infinispan:13.0"> <!-- 其他配置... --> <cache-container name="cacheContainer" default-cache="cacheExample"> <transport lock-timeout="60000"/> <!-- 添加transport配置 --> <local-cache name="cacheExample"> <locking isolation="READ_COMMITTED"/> <transaction locking="OPTIMISTIC" mode="NONE"/> <heap-memory size="100"/> <expiration lifespan="3600000"/> <file-store passivation="true" purge="true"/> </local-cache> </cache-container> </subsystem>
添加default-cache属性和transport元素,确保容器启动时能正确加载默认缓存。
6. 排查Java 17模块类加载问题
Java 17的模块系统可能影响类加载,确保应用的module-info.java(如果存在)正确导出/导入Infinispan相关模块:
module your.app.module { requires org.infinispan.api; requires jakarta.ws.rs.api; requires jakarta.annotation.api; requires jakarta.enterprise.cdi.api; exports com.your.package to jakarta.ws.rs.api; }
如果没有使用模块系统,确保war包中未包含WildFly内置的Infinispan相关类。
内容的提问来源于stack exchange,提问作者emresahin
相关产品推荐
相关产品推荐

