一个关于java.util.NoSuchElementException异常的排查过程

事件背景

这一阵子在处理我们公司现有的一个系统,没有源码,现在用的代码是把生产环境给反编译得到的。

在我把主要功能按需求调整完之后,寻思整理一下用户的权限,当我打开角色里的分配节点功能的时候,发现页面有问题。不显示任何信息。如图1。同时Eclipse里看到了报错。如图2。

图1
图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的样子。

图3
图4

第二行<property name="hibernate.use_sql_comments" value="true" />的作用是在图4的基础上,输出了如图5的一段注释。 

图5

 逐条排查之后,发现这异常是<property name="hibernate.use_sql_comments" value="true" />所引起的,注释掉这一行,之前提到的功能展示正常了。

图6

到这里,这个功能为什么在生产环境中能正常使用,而在我本地环境中报错的原因找到了。那么接下来就要去看看这个功能和其它功能有什么区别,分析为什么只有打开这个功能的时候抛出了异常。

图7

 这么看,这个页面对后台发起了两次请求,第一次拿到的是全部的功能节点(第10行),第二次拿到的是当前角色被授权了的功能节点。debug发现,就是在拿当前角色被授权了的节点的时候抛出了异常。过程如下。

图8 RoleAction.RoleAction里用ief.listByClause()方法实现的获取数据

 

图9 调用获取数据的方法

 

图10 执行return (List<E>)q.list();之后抛出的异常

为什么这里会抛出异常,还没搞清楚。先把配置文件里的那个配置给去掉了。毕竟它对我来说帮助不大。后期考虑改造JS及RoleAction,用一次请求完成前台需要的数据。

好了,先写到这儿了。写代码去了。欢迎对这问题有经验的、感兴趣的小伙伴们留言讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rarenmen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值