关于java:什么导致速度Template.merge()失败? 如何避免呢?

关于java:什么导致速度Template.merge()失败? 如何避免呢?

What causes a velocity Template.merge() failure? How does one avoid it?

我们的团队一直在遇到速度模板问题。 渲染后,有些人抛出RuntimeException并显示消息" Template.merge()失败-无法渲染Velocity模板'/template.vm'"。 我们无法重现该问题,并且网络上的文档还远远不够。 问题并非始终可再现-有时渲染会导致错误的相同模板也可以在其他时间成功显示。 Template类的源代码也几乎没有帮助。 先感谢您。

编辑:基于Nathan Bubna的回复,我需要澄清一下,我们使用的是Velocity 1.4版。

编辑:由于有人指出堆栈跟踪将是有益的,这里是:

2008-09-15 11:07:57,336错误速度-Template.merge()失败。该文档为空,很可能是由于解析错误。
2008-09-15 11:07:57,336错误VelocityResult-无法呈现Velocity模板,'/ search / [template-redacted] .vm'
java.lang.Exception:Template.merge()失败。该文档为空,很可能是由于解析错误。
在org.apache.velocity.Template.merge(Template.java:277)
在com.opensymphony.webwork.dispatcher.VelocityResult.doExecute(VelocityResult.java:91)
在com.opensymphony.webwork.dispatcher.WebWorkResultSupport.execute(WebWorkResultSupport.java:109)
在com.opensymphony.xwork.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:258)
在com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:182)
在com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
在com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
在com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
在com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
在com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
在com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
在com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
在com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
在com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
在com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
在com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
在com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
在com.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:116)
在com.opensymphony.webwork.dispatcher.ServletDispatcher.serviceAction(ServletDispatcher.java:272)
在com.opensymphony.webwork.dispatcher.ServletDispatcher.service(ServletDispatcher.java:237)
在javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
在com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:39)
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
在org.nanocontainer.nanowar.webwork2.PicoObjectFactoryFilter.doFilter(PicoObjectFactoryFilter.java:46)
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
在org.nanocontainer.nanowar.ServletRequestContainerFilter.doFilter(ServletRequestContainerFilter.java:44)
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
在com.bostoncapital.stuyvesant.RememberUserNameFilter.doFilter(RememberUserNameFilter.java:30)
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
在org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:526)
在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
在org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:825)
在org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.processConnection(Http11Protocol.java:738)
在org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:526)
在org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
在org.apache.tomcat.util.threads.ThreadPool $ ControlRunnable.run(ThreadPool.java:684)
在java.lang.Thread.run(未知来源)

好。


您正在使用什么版本的Velocity?导致此问题的是旧版本中的某些竞争条件。大多数都被压缩在Velocity 1.5版本中。虽然我个人建议使用Velocity 1.6-beta1。它极大地提高了性能(内存和速度),并且修复了许多小错误,这些错误并未使它变成1.5。

编辑:由于您说您正在使用1.4,那么,是的,我确定这是我们修复的比赛条件。请考虑升级。 1.6绝对是您最好的选择,因为它可以修复您的错误并提高性能。 1.6决赛应该很快出来。


我现在正在我们的网站上处理同一错误。

它似乎确实是一个竞争条件:我可以使用多个进程来读取同一页面,从而始终如一地重现它,但是如果我对请求进行序列化,则永远不会重现它。

我正在使用velocity-1.5;我尝试迁移到1.6-beta1,但看到其他错误。

解决:请参阅下面的评论


我已经通过电子邮件发送了代码的作者,以查看他们是否可以提供一些见解。我将确保分享我学到的任何东西。


您需要获取RuntimeException及其原因的完整堆栈跟踪。

请编辑您的答案以添加该信息。


由于源中的注释已经说明了这种情况不应该发生,因此我认为这是Template软件中的错误。将错误报告提交给编写该报告的人。


推荐阅读