【问题标题】:mustache and Internalviewresolvers - Spring MVCmustache 和 Internalviewresolvers - Spring MVC
【发布时间】:2016-09-17 13:26:02
【问题描述】:

我正在尝试使用 spring mvc 项目的 mustache 模板。我有一些使用 JSP 的代码,我想仅为某些页面添加 mustache 模板。为此,我添加了一个新的 mustacheViewResolver 和我现有的 InternalResourceViewResolver,如下所示。

@Bean
public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setViewClass(JstlView.class);
    viewResolver.setPrefix("/WEB-INF/views/jsp/");
    viewResolver.setSuffix(".jsp");
    viewResolver.setOrder(2);
    return viewResolver;
}

@Bean
public ViewResolver mustacheViewResolver() {
    ScriptTemplateViewResolver viewResolver = new ScriptTemplateViewResolver();
    viewResolver.setPrefix("/static/templates/");
    viewResolver.setSuffix(".html");
    viewResolver.setOrder(1);
    return viewResolver;
}

只有其中一个有效,但不能同时有效。当打算转到 userform.jsp 时,它转到 userform.html。

[WARNING] /myproject/users/add
java.io.FileNotFoundException: class path resource [static/templates/users/userform.html] cannot be opened because it does not exist
    at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:172)
    at org.springframework.web.servlet.view.script.ScriptTemplateView.getTemplate(ScriptTemplateView.java:369)
    at org.springframework.web.servlet.view.script.ScriptTemplateView.renderMergedOutputModel(ScriptTemplateView.java:349)
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1243)
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1027)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:971)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:969)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:860)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:845)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:808)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
    at org.eclipse.jetty.server.Server.handle(Server.java:499)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
    at java.lang.Thread.run(Thread.java:745)

关于如何同时使用模板和 JSP 视图解析器的任何线索?

【问题讨论】:

    标签: java spring-mvc web template-engine mustache


    【解决方案1】:

    ScriptTemplateView 没有正确检查模板文件是否可用,它应该根据其 Javadoc。这是一个错误 - 检查SPR-14729

    请升级到相关的 Spring 版本。

    请注意,您还应该像这样保持视图解析器的顺序,因为与其他模板引擎不同,InternalResourceViewResolver 和 JSP 无法检查模板是否存在并且确实会抛出异常,这就是为什么它们通常在最后配置链的。

    【讨论】:

    • 所以您针对最新的快照版本进行了测试?那些应该明天发布。
    • 不,我没有在 Jira 中列出的所有版本中进行测试。我只在 4.3.3.BUILD-SNAPSHOT 版本上测试过。
    • 感谢您试用此快照版本!从您可能在 4.2.x 上的例外情况来看 - 下一个 4.2 版本也将附带一个修复程序。当然,升级到 4.3 是个好主意。
    • 是的。我使用的是 4.2.4.RELEASE。感谢您的修复和及时响应。
    【解决方案2】:

    由于InternalResourceViewResolver 在层次结构上实现ViewResolver,您需要从第二个解析器返回ScriptTemplateViewResolver,让spring 知道两者是不同的解析器。

    【讨论】:

      猜你喜欢
      • 2017-02-11
      • 1970-01-01
      • 2013-02-11
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      相关资源
      最近更新 更多