使用 JeeSite 过程中的 ★ 常见问题 ★
# 部署与环境
下载不到
jeesite-xxx.jar
依赖包:有可能是您的 Maven 配置文件setting.xml
里添加了mirror
导致的问题,请删除这些配置,再尝试执行/web/bin/package.bat
脚本,预先下载依赖 jar 包即可。如果遇到 IDEA 下不编译,可以尝试
File -> Settings -> Build -> Build Tools -> Maven -> Maven home directory
选择Bundled(Maven3)
选项,还原默认,因为 IDEA 匹配的 Maven 版本耦合度要求较高,建议使用自带的,如果指定了其它 Maven home 可能会导致 IDEA 调用 Maven 报错,导致编译错误。如果遇到
Could not transfer artifact xxx from/to maven-default-http-blocker (http://0.0.0.0/)
错误,需要手动删除settings.xml
里的id
为maven-default-http-blocker
镜像,因为 maven 3.8 版本后增加了这个镜像,导致的请求错误;IDEA 下请打开 IDEA 所在安装目录,找到\plugins\maven\lib\maven3\conf\settings.xml
文件,并删除maven-default-http-blocker
镜像配置。如果遇到
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException
这个错误一般 jdk 的问题,使用 openjdk 再试下。国内 Maven 私服:官方已将 v4.1.8 及以上版本的 Maven 仓库已迁移到国内仓库,从旧版升级上来的用户请更新
/parent/pom.xml
和/web/pom.xml
最下方的repositories
和pluginRepositories
的仓库地址为最新的仓库配置地址代码。已付费用户,请使用官方提供的 Maven 私服工具。IDEA 中提示
NoClassDefFoundError: javax/servlet/ServletOutputStream
错误,您只需要修改 web 项目下的 pom.xml,注释掉spring-boot-starter-tomcat
的<scope>provided</scope>
部分改为<scope>compile</scope>
即可。出现
NoSuchMethodError
错误,一般是依赖包版本冲突,请 Maven 依赖分析,是否有多个依赖版本导致覆盖,Eclipse 下在 web 项目上右键,选择菜单 -> Maven -> Update Project...(或按Alt+F5) -> 点击 Select All 按钮 -> 选择 Force Update of Snapshots/Releases 复选框 -> 点击OK按钮即可;IDEA 下点击 Maven 选项卡的 Reload All Maven Projects 按钮。MySql 执行
init-data.bat
初始化数据失败,您可尝试设置下 my.ini 给 [mysqld] 增加如下配置:
sql_mode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
- MySql 下如果遇到
ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.
错误,请在 my.ini 中加入如下配置:(也可将忽略这个错误,仅会影响查询当前节点并包含所有下级节点的一点性能)
a)打开 my.ini 给 [mysqld] 增加如下配置:
innodb_large_prefix = ON
innodb_file_format = Barracuda
innodb_file_per_table = ON
b)并修改报错的建表语句后面加上:
ENGINE=InnoDB row_format=DYNAMIC;
c)若没有修改my.ini的权限也可以使用命令查看参数和设置参数:
show global variables like "innodb_large_prefix";
show global variables like "innodb_file_format";
show global variables like "innodb_file_per_table";
set global innodb_large_prefix=ON;
set global innodb_file_format=Barracuda;
set global innodb_file_per_table=ON;
d) 数据库编码类型改为 utf8,非 unicode
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
MySql 下报
You can't specify target table 'xxx' for update in FROM clause
错误,这是在Mysql的一个BUG,影响版本 MySql 5.7.6 到 5.7.10 【参考 (opens new window)】,并避开此版本,升级MySql数据库,即可解决。若在初始化每一行语句的都报事务相关的错。MySql下报
The command cannot be executed when global transaction is in the ACTIVE state
,Oracle下报SQLSyntaxErrorException: ORA-02089: COMMIT 不允许在附属会话中
错误。请检查设置jdbc.jta.enabled=false
是否关闭后再进行尝试导入。启动报
UnsatisfiedLinkError
错误,如果您是在 Eclipse 手动部署到 Tomcat 服务,请打开 Servers 选项卡,双击您新增的 Tomcat 服务,进入设置,找到Server Options
给以下选项Serve models without publishing
和Pushlish module contexts to separate XML files
打钩即可修改文件都需要重启比较麻烦,其实不是这样的,使用 Debug 运行系统,除非改变类结构(新增java类,新增属性或方法)才需要重启;其它情况(修改java类内的方法,修改视图文件,修改静态文件)下都不需要重启的。另外推荐使用 JRebel 热部署插件,可动态加载类结构。不建议使用 spring-boot-devtools 插件。
IntelliJ IDEA 中不能自动编译,修改类或资源文件后必须重启才生效,设置方法:IDEA (opens new window)、IDEA 2020 (opens new window)
设置 yml 里的参数后没有生效:检查您的yml格式是否正确、前面必须是空格(下级缩进为2个空格)、不能是Tab符号、检查父级选项是否打开、yml语法格式文档:http://www.ruanyifeng.com/blog/2016/07/yaml.html (opens new window)
自己新建的模块,为什么打包的时候,提示找不到我新增模块的类?是依赖问题。解决方法:先打包依赖项目,就是您自己新建的模块
mvn install
安装到本地 Maven 仓库,再打包被依赖项目。建议,将您新建的模块加入/modules/pom.xml
或/root/pom.xml
模块里,打包项目的时候,直接运行/root/bin/backage.bat
一键打包即可。
# 缓存与会话
使用缓存工具类 CacheUtils 过程中,当设置 timeToLiveInSeconds 时报错
Region [sysCache] TTL 3600 not match with 60
?原因是指定的缓存名称
的超时时间,必须和初次使用的超期时间一致,如果您启用了 Redis 并在CacheUtils.put("缓存名称", key, value,60)
前面,率先调用了CacheUtils.get("缓存名称", key)
系统就会初始化一个空缓存,这个空缓存的初始值是 3600,解决办法:CacheUtils.get("缓存名称", key, defaultValue, 60)
加 TTL 参数;另外一种情况如果您调用的是SysCacheUtils
设置的缓存,其实是存储到了sysCache
缓存名称里了,这个缓存是使用内置的,启动系统的时候就已经初始化了;我们建议您从 yml 里设置j2cache.caffeine.region.缓存名称
的超时时间(3600 就是默认的超时时间)方便配置化管理。缓存 CacheUtils 的 timeToLiveInSeconds 参数,是从写入时间,还是最后访问时间开始计算?一级缓存使用的 caffeine.expireAfterWrite 所以是从写入时间开始计算,二级缓存是 Redis 管理的,默认也是写入时间开始计算。
为什么 Redis 存储的数据没有设置上过期时间?Redis 默认存储模式为 hash 模式,因为 hash 存储不支持对 Key 指定过期时间,所以需要你设置
j2cache.redis.storage
存储模式为generic
,将 Key 以缓存级别存储。并设置j2cache.broadcast.cache_clean_mode
缓存清理模式,设置为active
主动清除模式,当二级缓存过期时,主动通知各节点清除。如果对缓存过期要求较高,还可以设置为blend
双模式,当一级缓存或二级缓存过期时,主动通知各节点清除。多个项目共用一个 Redis 到时候,如何区分?可设置
j2cache.redis.channel
和j2cache.redis.namespace
参数为不同的名称即可。为何设置
session.sessionTimeout
会话超时时间大于30分钟将无效?因为会话是由 J2Cache 缓存管理的,J2Cache 默认有个缓存超期时间,所以您还需要设置j2cache.caffeine.region.sessionCache
最大个数和超时时间,v4.2 之前版本打开j2cache.properties
属性文件进行设置。v4.4.0 或 v5.0.1 及以后版本,新增了根据设备,设置独立缓存超时时间,如session.pcSessionTimeout
为 PC 端超时时间,session.mobileAppSessionTimeout
为手机端超时时间。如果您一个域名下部署了多个项目,可能会导致登录一个项目,另一个项目的会话被挤下的问题?这是因为 Cookie 的 Session 名称冲突原因,您只需要修改
application.yml
里的session.sessionIdCookieName
值为,多个项目不一样的就可以。
# 其它问答
如果 erm 文件打不开,使用 Eclipse 安装 ERMaster 插件,菜单 Help -> Install New Software -> Work with:填写
https://jeesite.com/ermaster
回车 -> 取消 Contact all update site... 复选框 -> 取消 Group items by category 复选框 -> 点击 Select All -> 点击 Next 直到 Finish 按钮;也可以手动下载 https://gitee.com/thinkgem/ermasterr (opens new window) 代码仓库到本地磁盘,在 Work with 中,直接填写代码仓库路径下的/ermasterr/updatesite
目录,进行安装。具体详见:https://jeesite.com/docs/code-gen/ (opens new window)视图文件的全局变量有 ${ctx}、${ctxPath}、${ctxAdmin}。ctxPath 是 context-path 就是项目路径(如:/js);ctxAdmin 是 yml 里配置的 adminPath(如:/a);如果当前页面在 /a 下 ctx 等于 ctx+ctxAdmin(如:写 ${ctx} 结果就是 /js/a)
视图文件中 ${ctx} 和 ${ctxStatic} 是在哪里定义的,怎么添加新变量?https://gitee.com/thinkgem/jeesite5/issues/IICBF (opens new window)
登录后菜单不见了,菜单状态自动变为 2 停用状态?请检查下菜单归属的模块对应的状态是什么,归属模块指定的class必须是一个存在的class,如果不存在,模块状态会为“未安装”。所以菜单对应模块状态必须为“启用”才可以,否则启动系统时会自动设置菜单的状态停用。如果不需要此特性,您也可以关闭它:menu.updateStatusByModuleStatus=false
菜单权重是什么,添加的默认权重菜单,超级管理员怎么看不到:【内置功能】 搜索:
菜单权重
新建用户后的密码是多少?系统默认密码是
123456
。为了方便HR进行管理用户,不需要手动去设置一个密码,系统会自动默认,您也可以从参数设置
菜单中找到sys.user.initPassword
修改初始密码。从数据库里修改密码后为什么没有生效?因为有系统用户缓存,如果使用 system 无法登录系统,需要重启服务和清理Redis缓存即可生效,如果可以登录,进入缓存管理菜单,点击清理缓存即可。
为什么当 Dao 调用,会加一个 status != 1,Service 调用,会加一个 status = 0?如果您的表中有 status 这个字段的时候就会默认加上,是因为大多数业务系统 Dao 调用都需要排除逻辑删除的数据,Service 调用查询正常的数据,为节省手动调用的麻烦。在特殊业务场景下,如果不需要添加状态条件,可以手动调用
sqlMap.getWhere().disableAutoAddStatusWhere()
进行状态查询条件即可,如果想使用 Service 查询非删除的数据,则调用entity.setStatus("")
将状态设置为空字符串即可。如果您开启了多租户,就会默认增加 corp_code 这个条件,有些情况需要管理员看全部数据,这时候,您可以调用
sqlMap.getWhere().disableAutoAddCorpCodeWhere()
方法就不会默认添加这个字段了。文件上传按钮点击没反应,这个可能是因为您的窗口位移或上传控件显示隐藏造成的,在位移或显示后,调用
window.webuploaderRefresh();
即可刷新按钮控件位置。主子表的子表,第一次点击提交按钮时,子表数据不能提交到后台(子表属性没有添加 xxxList[i].xxxx 前缀);第二次点击提交按钮时,才能提交后台。这是因为在初始化 dataGrid 时会先去绑定表单 submit 事件,执行 dataGrid 的 updateListFieldName 方法,然后在进行提交。如果您将 validate 绑定表单事件放到 dataGrid 初始化前面去执行,就不会先去执行 updateListFieldName 所以造成了,第一次没有生效。解决方法:将 validate 代码,移动到 dataGrid 代码后面。
为什么 “作业监控”、“消息推送”、“国际化管理” 等功能菜单,显示 404 页面,是因为有些功能默认是没有开启的。您需要打开
application.yml
配置文件开启对应设置,如:web.core.enabled=true
、job.enabled=true
、msg.enabled=true
、lang.enabled=true
等。Spring Boot 上传文件报错:
java.io.IOException: The temporary upload location [xxx] is not valid
,是因为:服务器内未查到指定目录。在application.yml
配置文件加入spring.servlet.multipart.location=/tmp/jeesite-tmp
配置,指定您的服务器临时目录即可为什么在线预览打不开,提示 “An error occurred” 错误。若您没有配置 LibreOffice,则此功能默认使用的微软公司 Office Web Viewer (opens new window) 服务,需要将项目部署到外网域名默认端口才可以使用该功能。
如果数据表格使用复选框的时候出现重复的参数提交,请尝试将
$('#dataGrid').jqGrid('setGridParam', {postData: {}});
加入到ajaxSuccess
事件里。为何我下载的代码没有顶部菜单?这个可以在 “参数设置” 菜单里找 “sys.index.menuStyle” 参数,设置为 “1” 即可将一级菜单显示到顶部。
下载文件提示 “文件已丢失或不存在”,该问题说明下载的文件没有在磁盘上,上传的文件默认存储在 webapp 下,有可能是您通过 IDE 多次部署的时候,清理了原部署文件,里面可能就包含已上传的文件。建议您修改 application.yml 里的
file.baseDir
指定一个绝对路径即可解决问题。点击链接浏览器返回了 JSON 字符串,请按 F12 打开浏览器控制台,检查当前页面是否有 js 错误,若有根据情况解决,若没有错误,检查链接绑定 js 方法是否对 JSON 数据进行正确处理。
资源定义 Controller 应该返回一个视图页面,但返回了 JSON 字符串。一般这个问题开发环境正常,部署到正式上出现这个问题,问题原因是 Controller 返回的视图路径不对,导致返回了默认视图(JSON)。由于开发环境大多数是 Windows 系统,是不区分路径和文件名大小写的,发布到 Linux 上,文件系统是区分大小写的,大小写敏感的,导致找不到视图文件。出现这个问题时,请仔细检查视图文件路径是否匹配。
提示“403 - 您的操作权限不足”,说明对应的 URL 当前用户没有权限访问,检查 Controller 的映射方法上的 @RequiresPermissions 注解,是否在 “菜单管理” 里的 “权限字符串” 中配置了,并且当前用户对应的角色是否拥有该权限菜单。
我自己给绑定的弹窗事件,为什么会多打开一个页签?系统默认会绑定 class 里包含 addTabPage 或 btnList 或 btnTool 的标签进行弹窗操作,如果不需要默认弹窗可以删除这些名字即可。
Tomcat 部署下 SSO单点登录、OAuth2登录、无条件登录等方式,出现 login 无限跳转,但使用 Application.java 运行时正常的。请检查是否有多个类继承 SpringBootServletInitializer ,否则会造成 Servlet 容器多次重复加载。