求助波总,关于 ModelRecordElResolver.init的问题

ModelRecordElResolver.init(servletContext); 这句话我放在了 spring的ApplicationListener中和ServletContextListener中;

这句话在本地开发的时候不会报错,但是只要不输到服务器上就不行,阿里云的linux 服务器;

报错原因是 JspFactory.getDefaultFactory().getJspApplicationContext(context); 中JspFactory.getDefaultFactory()这个调用返回的是空值;

我跑了一个最简单的 jfinal 也是报错;查了很久的资料也没查出来,项目进度着急。波总帮帮忙分析一下是怎么回事;

本地不管是在eclipse里面还是 独立的tomcat 这句话JspFactory.getDefaultFactory() 都会有返回值。放到服务器就没有返回值。应该是和环境有关但是都是jdk1.8;实在是想不出来怎么回事了;

评论区

JFinal

2019-06-20 16:58

这个可能是你打包的时候没有去掉 jetty-server 依赖造成的

JspFactory 这些东东是 servlet 规范里头的,jetty 与 tomcat 都有自己的实现,如果不去掉会有冲突

在文档中有过说明,部署到 tomcat 之前,一定要删干净 jetty 或者 undertow 的依赖:
https://www.jfinal.com/doc/1-7

mrbai2018

2019-06-20 17:07

@JFinal 波总,我是传统方式开发的,没有用到pom ,而且我写的小例子压根就没有jetty-server的任何东西。就简单的jfinal框架。 我写了一个 ServletContextListener,就把这个放到服务器上都是空的。

JFinal

2019-06-20 17:39

@mrbai2018 开发环境是什么? 是 tomcat 还是 jetty

mrbai2018

2019-06-20 17:40

JFinal

2019-06-20 17:40

@mrbai2018 如果用的 undertow 就要注意了,因为 undertow 默认不支持 JSP,这个是 jfinal 无法干预的事情

mrbai2018

2019-06-20 17:41

@JFinal 我本地 都能用,就是扔到线上 这个ModelRecordElResolver.init(servletContext);就不好用了,所有页面的取值就都出问题了。这个是spring和jfinal的结合。加上jsp

JFinal

2019-06-20 17:41

@mrbai2018 如果是 "非嵌入式" tomcat 用法,默认就自带 servlet 这些东东,按理说是可以直接支持的,你先注意掉 ModelRecordElResolver.init(servletContext) 这行代码跑一跑看看

确保能跑起来,再回过头来解决这个问题,或许改变一下这行代码的加载地点就可以了

JFinal

2019-06-20 17:42

例如,将这个 ModelRecordElResolver.init(servletContext) 放在某个类的 static 块之中,只要是在使用之前加载就可以

spring 有工具类在任何地方获取 ServletContext,所以这个初始化动作放在任何地方都方便

mrbai2018

2019-06-20 17:44

@JFinal 好的,我试试。

JFinal

2019-06-20 17:44

@mrbai2018 你在本地能用,扔到线上不能用,这个相对来说比较好解决, 重点关注线上环境与你本地环境有啥区别,用好排除法,例如 tomcat 的版本号之类的

还要注意部署方式,在本地能用,可能是你在 eclipse 中使用 tomcat 能用, 如果你在本地使用与远程一样的部署方式不一定就能用

mrbai2018

2019-06-20 18:18

@JFinal 好的波总,我试试,这个项目是半路接手的。有点乱。我整理整理再看,我怕出问题,环境基本都是一样的,直接把本地运行好的 拷贝上去运行的。 我先在找找看,太感谢了波总,你太热情了。

JFinal

2019-06-20 18:23

@mrbai2018 俱乐部会员该享有的价值

热门反馈

扫码入社