Spring Boot配置Infinispan作为Hibernate二级缓存遇JNDI获取CacheManager失败
解决Spring Boot配置Infinispan作为Hibernate二级缓存的JNDI异常问题
我之前也踩过这个坑!这个异常本质是Hibernate默认尝试从JNDI地址java:CacheManager获取CacheManager,但Spring Boot独立运行环境里根本没在JNDI中绑定这个实例——你参考的JBoss文档是针对WildFly/JBoss EAP服务器场景的,那种环境下服务器会自动做JNDI绑定,但Spring Boot得咱们自己配置。下面给你几个靠谱的解决方向:
1. 修正application.properties核心配置
首先把Hibernate的缓存配置改成直接指向Infinispan提供器,并且禁用JNDI查找:
# 启用二级缓存 spring.jpa.properties.hibernate.cache.use_second_level_cache=true # 指定用Infinispan作为缓存区域工厂 spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.infinispan.InfinispanRegionFactory # 关键:清空JNDI名称,让Hibernate不要去JNDI找CacheManager spring.jpa.properties.hibernate.cache.infinispan.cachemanager_jndi_name= # 如果有自定义的Infinispan配置文件,指定路径(可选) spring.jpa.properties.hibernate.cache.infinispan.configuration=classpath:infinispan.xml
2. 确认依赖版本匹配
别忽略依赖的版本兼容性!Spring Boot版本对应的Hibernate版本要和Infinispan的Hibernate缓存适配包版本对应:
Maven示例(适配Spring Boot 2.x + Hibernate 5.x):
<dependency> <groupId>org.infinispan</groupId> <artifactId>infinispan-hibernate-cache-v53</artifactId> <version>12.1.7.Final</version> </dependency>
Gradle示例:
implementation 'org.infinispan:infinispan-hibernate-cache-v53:12.1.7.Final'
3. 手动注册CacheManager Bean(兜底方案)
如果上面的配置还是没解决,直接手动创建一个本地的CacheManager Bean,让Hibernate复用这个实例:
import org.infinispan.manager.DefaultCacheManager; import org.infinispan.manager.EmbeddedCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.io.IOException; @Configuration public class InfinispanCacheConfig { @Bean public EmbeddedCacheManager infinispanCacheManager() throws IOException { // 这里可以用默认配置,也可以加载自定义的infinispan.xml return new DefaultCacheManager("classpath:infinispan.xml"); } }
然后在application.properties里加上:
# 告诉Hibernate使用已经存在的CacheManager Bean spring.jpa.properties.hibernate.cache.infinispan.use_existing_cache_manager=true
4. 区分JBoss文档的场景差异
你参考的JBoss文档是针对服务器环境的,那种环境下服务器会自动在JNDI中注入CacheManager,但Spring Boot是独立应用,没有这个机制,所以一定要把文档里依赖JNDI的配置项去掉或者覆盖,换成Spring Boot环境的本地配置方式。
内容的提问来源于stack exchange,提问作者Pavan Jadda
相关产品推荐
相关产品推荐

