JFinal使用TxByRegex进行事务控制,没有提示正确的错误信息。

forai 发布于 2013/06/27 20:25
阅读 1K+
收藏 0

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

今天早上在开发的时候发现,在controller里面所有的错误都抛出一个com.jfinal.render.RenderException: java.io.FileNotFoundException: Template /saveGq.html not found.

没有给我提示真正的异常。

我的这个controller最后调用的是renderJson();

我跟踪了一下,我在Model.save()的时候,抛出的ActiveRecordException没有被JFinalFilter捕获,而且跑到了freemarkerRender里面去了,报了一个FreeMarkerRender的错误。

本来应该是java.sql.SQLException: 无效的列类型,结果没有提示。

查了好久,发现问题出在TxByRegex,我在配置拦截器的时候使用了TxByRegex以后,controller异常的时候就没有提示真正的异常信息,我把me.add(new TxByRegex(".*save.*", false));注释了以后,真正的出错信息就是控制台提示了。不知道是不是一个BUG啊波波兄。

早上纠结了好久。


加载中
0
JFinal
JFinal
    目测是拦截器重新 render 了,贴出详细的错误提示,建议调试定位抛出异常的那行代码
0
forai
forai

引用来自“JFinal”的答案

    目测是拦截器重新 render 了,贴出详细的错误提示,建议调试定位抛出异常的那行代码
[ERROR]-[Thread: http-8081-1]-[com.jfinal.core.ActionHandler.handle()]: /saveGq
com.jfinal.render.RenderException: java.io.FileNotFoundException: Template /saveGq.html not found.
    at com.jfinal.render.FreeMarkerRender.render(FreeMarkerRender.java:128)
    at com.jfinal.core.ActionHandler.handle(ActionHandler.java:92)
    at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:619)
Caused by: java.io.FileNotFoundException: Template /saveGq.html not found.
    at freemarker.template.Configuration.getTemplate(Configuration.java:489)
    at freemarker.template.Configuration.getTemplate(Configuration.java:452)
    at com.jfinal.render.FreeMarkerRender.render(FreeMarkerRender.java:124)
    ... 14 more
0
forai
forai

引用来自“JFinal”的答案

    目测是拦截器重新 render 了,贴出详细的错误提示,建议调试定位抛出异常的那行代码

错误信息已经贴上来了。我这里render的是Json,怎么会跳到了freemarker去了。

debug跟踪到了DB.tx()方法(Db类的797行),异常到这里就被catch了,没有继续往外面丢,throw new ActiveRecordException(e);被注释了,这是为啥波波兄。你看看是不是该继续往外面丢才对。

0
forai
forai

引用来自“JFinal”的答案

    目测是拦截器重新 render 了,贴出详细的错误提示,建议调试定位抛出异常的那行代码

我看了一下1.3的代码,在哪个位置是抛出去异常了的。

1.4的代码被注释了,是不是波波兄你忘记了 ?

0
JFinal
JFinal

引用来自“forai”的答案

引用来自“JFinal”的答案

    目测是拦截器重新 render 了,贴出详细的错误提示,建议调试定位抛出异常的那行代码

我看了一下1.3的代码,在哪个位置是抛出去异常了的。

1.4的代码被注释了,是不是波波兄你忘记了 ?

    不是忘了,当时的想法应该是:用 return false 来返告知上层事务执行不成功,而非抛出异常,这个事情值得再商议,你有何看法?
0
forai
forai

引用来自“JFinal”的答案

引用来自“forai”的答案

引用来自“JFinal”的答案

    目测是拦截器重新 render 了,贴出详细的错误提示,建议调试定位抛出异常的那行代码

我看了一下1.3的代码,在哪个位置是抛出去异常了的。

1.4的代码被注释了,是不是波波兄你忘记了 ?

    不是忘了,当时的想法应该是:用 return false 来返告知上层事务执行不成功,而非抛出异常,这个事情值得再商议,你有何看法?
这样的话,异常就被catch住了。比如说我这一次,因此没有找到异常信息,忙活了好久。这个跟JFinal“节约更多时间,去陪恋人、家人和朋友”,的核心思想相悖啊。而且我觉得,你要通知上层事务执行不成功,抛出异常以后,上层catch到也就知道了事务执行不成功了。
JFinal
JFinal
下一版我再仔细权衡一下,谢谢支持 :)
返回顶部
顶部