事件背景
这一阵子在处理我们公司现有的一个系统,没有源码,现在用的代码是把生产环境给反编译得到的。
在我把主要功能按需求调整完之后,寻思整理一下用户的权限,当我打开角色里的分配节点功能的时候,发现页面有问题。不显示任何信息。如图1。同时Eclipse里看到了报错。如图2。
去生产环境里看了一下,生产环境里这功能是正常的。可见这只是我本地环境的问题。首先想到的,可能是我用的源码是反编译来的,编译的源码存在问题。那么从日志里提到的RoleAction.java开始排查,去生产环境里找到相应的RoleAction.class,直接放到我本地的项目里,重启服务试了一下,问题依然存在。随后又找到一下ElementaryFileService.class。发现它是在一个jar包里,是开发这软件的公司自开发的底层包,在反编译的时候没有去动过的部份,也不可能出问题。经过比对生产环境和我本地环境,发现二者中WEB-INF\classes\META-INF\persistence.xml是不一致的。百度上说这个文件是JAP的配置文件。JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。我本地的文件里多了这么两行配置。
<property name="hibernate.format_sql" value="true" /> <property name="hibernate.use_sql_comments" value="true" /> |
第一行<property name="hibernate.format_sql" value="true" />的作用是格式化日志中输出的HQL,从图3的样子格式化成图4的样子。
第二行<property name="hibernate.use_sql_comments" value="true" />的作用是在图4的基础上,输出了如图5的一段注释。
逐条排查之后,发现这异常是<property name="hibernate.use_sql_comments" value="true" />所引起的,注释掉这一行,之前提到的功能展示正常了。
到这里,这个功能为什么在生产环境中能正常使用,而在我本地环境中报错的原因找到了。那么接下来就要去看看这个功能和其它功能有什么区别,分析为什么只有打开这个功能的时候抛出了异常。
这么看,这个页面对后台发起了两次请求,第一次拿到的是全部的功能节点(第10行),第二次拿到的是当前角色被授权了的功能节点。debug发现,就是在拿当前角色被授权了的节点的时候抛出了异常。过程如下。
为什么这里会抛出异常,还没搞清楚。先把配置文件里的那个配置给去掉了。毕竟它对我来说帮助不大。后期考虑改造JS及RoleAction,用一次请求完成前台需要的数据。
好了,先写到这儿了。写代码去了。欢迎对这问题有经验的、感兴趣的小伙伴们留言讨论。