setSessionAttr("user", user)需要实例化吗?

就是想问问我的一个类继承了Controller,用 setSessionAttr("user", user);这个方法报java.lang.reflect.InvocationTargetException,难道还要实例化Session吗?user对象不为空里面有东西QH72IS6UOS%F7W@U)L$3]89.png

评论区

JFinal

2017-06-05 16:30

setSessionAttr(...) 的源代码如下:
public Controller setSessionAttr(String key, Object value) {
request.getSession(true).setAttribute(key, value);
return this;
}

可知道 session 的实例化是自动化的,你的代码出现了 Null Pointer Exception,应该是 request.getSession(true) 这一行代码出的问题,这一行代码 jfinal 仅仅是转调了一下底层的 HttpServletRequest,这个在历史是从未出现过问题

目前为止我也不知道原因

qianqian123

2017-06-05 17:57

@JFinal 对调试也是这行出了问题,直接报null,还是不是很了解机制。

JFinal

2017-06-05 18:02

@qianqian123 检查两个地方,一个 request 这个对象是不是早已是 null,还有一个是 request.getSession(true) 这个获取到的是不是 null

检查的方法是在 controller 中使用:
HttpServletRequest request = getRequest();
HttpServletSession session = request.getSession(true);

要确保这两个对象不能为 null,确保的方式不是 jfinal 的范畴,要去检查 tomcat 这些东东,或许是你的项目改了 jfinal 源代码,造成这些值为 null

qianqian123

2017-06-05 18:02

我感觉是不是要有请求他才会自动实例化,我把它放到Controller里面就没有任何问题

qianqian123

2017-06-05 18:20

我知道了,我感觉是不是要有请求他才会自动实例化,我把它放到Controller里面就没有任何问题,哎被自己给套进去。

linuxea

2017-06-06 18:36

@JFinal 詹总。请问那个request一般是在什么情况实例化?我猜想是每一个请求都会实例的。不过好像情况并不是这样的。之前有遇到过request为null的情况。得把相应的方法放在controller的方法中,对,不是作为controller的类成员变量,而是要在方法中才能实例化request吗?

JFinal

2017-06-06 22:46

@linuxea request 是 tomcat、jetty 实例化好了,并将其转给你用的,不需要自己去操心 request 实例话的事情

linuxea

2017-06-07 10:03

@JFinal 原来是这样啊。谢谢

热门反馈

扫码入社