事件背景
这一阵子在处理我们公司现有的一个系统,没有源码,现在用的代码是把生产环境给反编译得到的。
在我把主要功能按需求调整完之后,寻思整理一下用户的权限,当我打开角色里的分配节点功能的时候,发现页面有问题。不显示任何信息。如图1。同时Eclipse里看到了报错。如图2。
![](https://i-blog.csdnimg.cn/blog_migrate/dd4b893bca034adb545c86633e595945.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4a040c3094ba7dd69c737025c125cca2.png)
去生产环境里看了一下,生产环境里这功能是正常的。可见这只是我本地环境的问题。首先想到的,可能是我用的源码是反编译来的,编译的源码存在问题。那么从日志里提到的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的样子。
![](https://i-blog.csdnimg.cn/blog_migrate/dbbbbbf3e4592d8071354495706ef6b1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/19339d3c17e79a5dde4e3b1b0bdec917.png)
第二行<property name="hibernate.use_sql_comments" value="true" />的作用是在图4的基础上,输出了如图5的一段注释。
![](https://i-blog.csdnimg.cn/blog_migrate/fa2140dcf64a6a36598f9262b591635a.png)
逐条排查之后,发现这异常是<property name="hibernate.use_sql_comments" value="true" />所引起的,注释掉这一行,之前提到的功能展示正常了。
![](https://i-blog.csdnimg.cn/blog_migrate/2db9b1c5f7e4ad5581c76bb18f7f23b5.png)
到这里,这个功能为什么在生产环境中能正常使用,而在我本地环境中报错的原因找到了。那么接下来就要去看看这个功能和其它功能有什么区别,分析为什么只有打开这个功能的时候抛出了异常。
![](https://i-blog.csdnimg.cn/blog_migrate/52131d31db57751b019c5fa3faecfedd.png)
这么看,这个页面对后台发起了两次请求,第一次拿到的是全部的功能节点(第10行),第二次拿到的是当前角色被授权了的功能节点。debug发现,就是在拿当前角色被授权了的节点的时候抛出了异常。过程如下。
![](https://i-blog.csdnimg.cn/blog_migrate/48ab6dbdb0f17a086546069d30263540.png)
![](https://i-blog.csdnimg.cn/blog_migrate/36e787e093e9d70f5e82170ea21a9dc3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9aafc7ccf679ae2a79f1ca29a67ceb70.png)
为什么这里会抛出异常,还没搞清楚。先把配置文件里的那个配置给去掉了。毕竟它对我来说帮助不大。后期考虑改造JS及RoleAction,用一次请求完成前台需要的数据。
好了,先写到这儿了。写代码去了。欢迎对这问题有经验的、感兴趣的小伙伴们留言讨论。