【问题标题】:What causes a velocity Template.merge() failure? How does one avoid it?是什么导致速度 Template.merge() 失败?如何避免它?
【发布时间】:2010-09-09 15:26:20
【问题描述】:

我们的团队在速度模板方面经常遇到问题。在渲染时,有些人会抛出带有消息“Template.merge() 失败 - 无法渲染速度模板,'/template.vm'”的 RuntimeException。我们无法重现该问题,并且网络上的文档非常不足。该问题并非始终可重现 - 其渲染有时会导致错误的相同模板也可以在其他时间无问题地显示。 Template 类source code 也没什么帮助。提前谢谢你。


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


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

2008-09-15 11:07:57,336 错误速度 - Template.merge() 失败。文档为空,很可能是由于解析错误。 2008-09-15 11:07:57,336 错误 VelocityResult - 无法呈现速度模板,'/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(Unknown Source)

【问题讨论】:

    标签: java velocity


    【解决方案1】:

    您使用的是什么版本的 Velocity?旧版本中有一些竞争条件导致了这种情况。大多数在 Velocity 1.5 版本中被压扁。虽然我个人建议使用 Velocity 1.6-beta1。它极大地提高了性能(内存和速度),并修复了许多未进入 1.5 的小错误。

    编辑:既然您说您使用的是 1.4,那么,是的,我确定这是我们修复的竞争条件。请考虑升级。 1.6 绝对是您最好的选择,因为它修复了您的错误并提高了性能。 1.6 final 应该很快就出来了。

    【讨论】:

    • 我们可以确认升级解决了问题。感谢您的帮助。
    【解决方案2】:

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

    这似乎是一种竞争条件:我可以使用多个进程获取同一页面来一致地重现它,但如果我序列化请求,则永远不会重现它。

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

    已解决:请参阅下面的 cmets

    【讨论】:

    • 请向用户或开发人员列表报告 1.6 的错误!我们正在努力修复它们。
    • 已解决:1.6 的问题与我们自己的#define 指令版本有关,与现在内置的指令冲突。我们目前正在使用 1.6-beta1 进行生产,不再出现此问题。
    【解决方案3】:

    由于源代码中的 cmets 已经声明不应该发生这种情况,我认为这是模板软件中的错误。向编写它的人提交错误报告。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        我已通过电子邮件向代码的作者发送电子邮件,看看他们能否提供一些见解。我会确保分享我学到的任何东西。

        【讨论】:

          猜你喜欢
          • 2016-04-11
          • 1970-01-01
          • 1970-01-01
          • 2020-09-23
          • 2011-04-04
          • 2015-11-09
          • 1970-01-01
          • 2012-10-25
          • 1970-01-01
          相关资源
          最近更新 更多