jfinal 设置全局404 500不生效是什么原因呢?

jelly_oy 发布于 2014/12/16 08:59
阅读 1K+
收藏 0

@JFinal 你好,想跟你请教个问题:

jfinal 设置全局404 500不生效是什么原因呢?

我在configConstant方法里面加了全局错误页面设置,如下:
me.setError404View("/WEB-INF/err404.html");
me.setError500View("/WEB-INF/err500.html");

当我在地址栏输入不存在的URL路径 /aaa/bbb , 并没有跳转到错误页面,下面是访问的截图:

在网上搜索后,有人说是由于错误页面文件小于1K,可是我的错误页面文件大小为3K,真不知道是什么原因?

请教各位大侠,这是什么原因呢?

加载中
1
JFinal
JFinal

     应该是没配置 Beetl 的 MainRenderFactory。注意看 com.jfinal.render.ErrorRender.java 的第51行有这样一行代码:RenderFactory.me().getRender(view).setContext(request, response).render(),调试跟踪到 getRender(view) 中去,最终是通过 IMainRenderFactory 来获取的 Render。

    而启用 Beetl 是需要配置 me.setMainRenderFactory(...)的,所以,只要配置好这个 mainRenderFactory 就不会去找 FreeMarkerRender 了

1
jelly_oy
jelly_oy

引用来自“JFinal”的评论

     应该是没配置 Beetl 的 MainRenderFactory。注意看 com.jfinal.render.ErrorRender.java 的第51行有这样一行代码:RenderFactory.me().getRender(view).setContext(request, response).render(),调试跟踪到 getRender(view) 中去,最终是通过 IMainRenderFactory 来获取的 Render。

    而启用 Beetl 是需要配置 me.setMainRenderFactory(...)的,所以,只要配置好这个 mainRenderFactory 就不会去找 FreeMarkerRender 了

谢谢詹波跟踪代码调试和耐心指导,也谢谢各位的耐心解答,

我加上 me.setMainRenderFactory(...) 就可以生效了,哈哈,真是牛人啊!

0
心有灵犀
心有灵犀
哎,,,看一下错误提示,一切都明白了
0
jelly_oy
jelly_oy

引用来自“心有灵犀”的评论

哎,,,看一下错误提示,一切都明白了

大侠,我用的是 beetl模板引擎,所以就没加freemarker的JAR包,

访问一个URL,如果对应的模板文件找不到,tomcat控制台会报错:

Caused by: java.io.FileNotFoundException: F:\workspace\bjez\WebRoot\admin\login.html (系统找不到指定的文件。)

但是浏览器页面为什么没有跳转到 404呢?

麻烦你再解答下啦!

0
台俊峰
台俊峰
这是因为你缺包了,项目没有成功启动,错误显示仍然是servlet容器的,并没有给jfinal接管。
0
jelly_oy
jelly_oy

引用来自“二郎真君”的评论

这是因为你缺包了,项目没有成功启动,错误显示仍然是servlet容器的,并没有给jfinal接管。
虽然缺少freemarker  JAR包,但是我的项目是正常启动的啊,真奇怪
F_L_F
F_L_F
这么多人说缺少jar,你就不能试着把jar添加进去????????
0
台俊峰
台俊峰

引用来自“二郎真君”的评论

这是因为你缺包了,项目没有成功启动,错误显示仍然是servlet容器的,并没有给jfinal接管。

引用来自“jelly_oy”的评论

虽然缺少freemarker  JAR包,但是我的项目是正常启动的啊,真奇怪

根据你的错误页面上的堆栈信息,我仔细看了下源码。

ActionHandler在判断action 为null后进行渲染404,这个时候创建ErrorRender实例并调用render()方法,由于你设置了ErrorView,最终renderFactory调用默认的Render(即freemarkerRender)去渲染你设置的路径的文件(/WEB-INF/err404.html)。导致了报缺少freemarker包的错误。

ActionHandler源码参考:

if (action == null) {
			if (log.isWarnEnabled()) {
				String qs = request.getQueryString();
				log.warn("404 Action Not Found: " + (qs == null ? target : target + "?" + qs));
			}
			renderFactory.getErrorRender(404).setContext(request, response).render();
			return ;
		}



ErrorRender.render()源码参考:


// render with view
		String view = getView();
		if (view != null) {
			RenderFactory.me().getRender(view).setContext(request, response).render();
			return;
		}

if(action==null)这部分代码并不在ActionHandler的try代码块里,出了异常actionHandler不会处理,所以最后是servlet容器处理的异常。



返回顶部
顶部