jfinal4.2版本e.getCause()=null

这段代码一直是从jfinal3.3-3.8使用:

                try {
			password = RSAKit.decryptionToString(password);
			loginService.aopLogin(userCode, password, getRequest());
			redirect(!returnUrl.equals("")?returnUrl:"/");
		} catch (Exception e) {
			handerException(e);
			SysUser user = sysUserService.findByUserCode(userCode);
			if (user != null) {
				isShowVerifyCode(user);
			}
			setAttr("returnUrl", returnUrl);
			setAttr("msg", e.getCause().getMessage());
			render("login.html");
		}

但是升级到4.2之后,e.getCause().getMessage()就出错了,原因是e.getCause()==null,不知道怎么会出现这个差异。

jfinal3.8之前的版本e.getMessage()会带上类的全名,所以要用到e.getCause().getMessage();

1.png

2.png


评论区

JFinal

2019-06-20 23:49

jfinal 4.2 主要是增强了业务层 AOP,如果这块代码与业务层 AOP 有关,可以试着单步调试对比来找到原因

我不知道具体原因,因为这块的变化并不涉及异常,老版本的业务层 AOP 用到了 cglib ,或许是 cglib 内部的处理方式与 jfinal 4.2 的有所不同

或许是你自己的代码有所变动引起的

琴海森林

2019-06-21 09:55

@JFinal 可能是去掉cglib的原因,这块业务代码我也是没改过,不过这个并无大碍

JFinal

2019-06-21 10:00

@琴海森林 你通过下面的配置,看能不能回到以前的状态:
configConstant(Constants me) {
me.setProxyFactory(new CglibProxyFactory());
}

这个配置是 cglib 对 proxy 模块的一个扩展,与以前的用法完全一样

琴海森林

2019-06-24 11:35

@JFinal 确实是,加上这个配置和cglib的依赖就正常了

JFinal

2019-06-24 11:43

@琴海森林 获取对象的过程中添加一个 if ( xxx == null) 判断, 兼容两种情况更完美

琴海森林

2019-06-24 11:48

@JFinal 现在就是这样处理 setAttr("msg", e.getCause()!=null?e.getCause().getMessage():e.getMessage());

琴海森林

2019-06-24 11:50

@JFinal 测试这个就是验证一下是不是cglib的原因