You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 13:22:04