controller中request初始化问题

image.png


詹总。有一个奇怪的问题。SuperController是继承自Controller。request作为类变量或者构造函数会有500错误。后台报错信息也没有。之前好不容易定位到是这个问题。请问一下为什么作为类变量就会有问题呢?request对象不是对应每个请求吗?所以理论上request对象是永远不可能为null的哩。

评论区

linuxea

2017-08-31 16:19

@jfinal 在执行到这里时报错:
Controller controller = action.getControllerClass().newInstance();

linuxea

2017-08-31 16:20

@jfinal 报了NullPointException

linuxea

2017-08-31 16:24

action不为null,Action属性controllerClass debug 进去看也不为null。

linuxea

2017-08-31 16:33

有点看出端倪了

linuxea

2017-08-31 16:46

@jfinal 我现在打算是覆盖 Controller 的 init方法。在里面先调用原 init 方法。再在后面写入我的逻辑。可是报了一个问题。这个真不明白了:

The method SuperController.init(HttpServletRequest, HttpServletResponse, String) does not override the inherited method from Controller since it is private to a different package

linuxea

2017-08-31 16:46

@linuxea 试一下能不能@我自己

linuxea

2017-08-31 16:46

@linuxea 可以。不错

linuxea

2017-08-31 16:47

詹总救命

linuxea

2017-08-31 17:21

好吧。这个也明白了。。。

JFinal

2017-08-31 17:26

Controller 刚被 new 出来的时候 request 还没有被注入进去,自然就无法使用

不要在 controller 构造方法中使用 request 对象,用拦截器就好

linuxea

2017-08-31 18:09

@JFinal 是可以注入request对象,不过感觉开销有点大。
try {
Method initList = controller.getClass().getSuperclass().getDeclaredMethod("_init_list", HttpServletRequest.class);
initList.setAccessible(true);
if(null != initList){
initList.invoke(controller,request);
}
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}

linuxea

2017-08-31 18:09

@JFinal 我还是在controller方法里面写获取request好了,虽然麻烦了一点点点

热门反馈

扫码入社