JHipster多租户应用生成时出现Hibernate缓存未定义错误
hibernateCache is not defined错误 问题重现
你用JHipster Generator v4.13.1搭建了主应用,接着执行以下命令安装多租户生成器:
npm install generator-jhipster-multitenancy
运行yo jhipster-multitenancy并回答完“应用中租户的别名是什么?(Company)”的提示后,突然抛出了如下错误:
events.js:182 throw er; // Unhandled 'error' event
^
ReferenceError: /home/joag/Proyectos/Munkys/prueba2/node_modules/generator-jhipster-multitenancy/generators/app/templates/src/main/java/package/domain/_User.java:26
24| import com.fasterxml.jackson.annotation.JsonIgnore;
25| import org.apache.commons.lang3.StringUtils;<% if (databaseType === 'sql') { %>26| import org.hibernate.annotations.BatchSize;<% } %><% if (hibernateCache !== 'no' && databaseType === 'sql') { %>
27| import org.hibernate.annotations.Cache;
28| import org.hibernate.annotations.CacheConcurrencyStrategy;<% } %>
29| import org.hibernate.validator.constraints.Email;
hibernateCache is not defined
at eval (eval at compile (/home/joag/Proyectos/Munkys/prueba2/node_modules/ejs/lib/ejs.js:549:12), <anonymous>:28:8)
at returnedFn (/home/joag/Proyectos/Munkys/prueba2/node_modules/ejs/lib/ejs.js:580:17)
at Object.exports.render (/home/joag/Proyectos/Munkys/prueba2/node_modules/ejs/lib/ejs.js:384:37)
...(剩余堆栈信息省略)
问题根源
这个错误的核心原因是多租户生成器的EJS模板依赖hibernateCache变量,但你使用的JHipster v4.13.1版本并没有在应用配置中提供这个变量,或者该生成器版本和你的JHipster版本不兼容。JHipster的配置变量在不同版本间会有调整,而generator-jhipster-multitenancy的模板大概率是针对更高版本的JHipster编写的,导致渲染模板时找不到这个关键变量。
可行解决方案
1. 匹配生成器与JHipster的兼容版本
首先你需要确认generator-jhipster-multitenancy是否支持JHipster v4.13.1:
- 查看该生成器的项目文档或package.json文件,找到它声明的兼容JHipster版本范围
- 如果它只支持更高版本的JHipster,你有两个选择:
- 升级你的主JHipster应用到兼容版本(注意:升级前务必备份代码,同时参考JHipster官方迁移指南处理版本差异)
- 安装对应兼容旧版本的多租户生成器,比如执行:
把npm install generator-jhipster-multitenancy@x.x.xx.x.x替换为支持JHipster v4.13.1的具体版本号。
2. 手动修改模板中的变量引用
如果你不想升级版本,可以直接修改报错的模板文件:
- 找到路径:
/home/joag/Proyectos/Munkys/prueba2/node_modules/generator-jhipster-multitenancy/generators/app/templates/src/main/java/package/domain/_User.java - 把第26行附近的
<% if (hibernateCache !== 'no' && databaseType === 'sql') { %>替换为JHipster v4.13.1中对应的缓存变量。在JHipster v4.x版本里,缓存配置用的是cacheProvider,所以改成:<% if (cacheProvider !== 'no' && databaseType === 'sql') { %> - 保存修改后,重新运行
yo jhipster-multitenancy即可。
3. 手动注入缺失的变量到生成器
另一种方法是修改多租户生成器的主逻辑,手动添加hibernateCache变量:
- 打开生成器的主文件:
/home/joag/Proyectos/Munkys/prueba2/node_modules/generator-jhipster-multitenancy/generators/app/index.js - 在模板渲染相关的代码前,添加如下内容:
// 从应用配置中读取缓存设置,或者默认设为'no' this.hibernateCache = this.config.get('cacheProvider') || 'no'; - 保存后重新运行生成器即可。
注意事项
- 直接修改node_modules里的文件是临时方案,如果你重新执行
npm install,所有修改都会丢失。建议如果采用这种方式,使用patch-package工具来持久化你的修改,或者把生成器fork到自己的仓库维护。
内容的提问来源于stack exchange,提问作者Joag

