从 jar 运行时,Spring Boot 给出“TemplateInputException:解析模板错误”

Posted

技术标签:

【中文标题】从 jar 运行时,Spring Boot 给出“TemplateInputException:解析模板错误”【英文标题】:Spring Boot gives "TemplateInputException: Error resolving template" when running from jar 【发布时间】:2015-01-30 16:18:26 【问题描述】:

我有一个在 IntelliJ 中或通过 gradle bootRun 启动时运行良好的应用程序。

但是,如果我执行 gradle bootRepackage 然后尝试运行生成的 jar,我最终会得到:

2014-12-02 21:46:14.086 ERROR 9839 --- [nio-2014-exec-2] org.thymeleaf.TemplateEngine             : [THYMELEAF][http-nio-2014-exec-2] Exception processing template "/login": Error resolving template "/login", template might not exist or might not be accessible by any of the configured Template Resolvers
2014-12-02 21:46:14.087 ERROR 9839 --- [nio-2014-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template "/login", template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause

org.thymeleaf.exceptions.TemplateInputException: Error resolving template "/login", template might not exist or might not be accessible by any of the configured Template Resolvers
    at org.thymeleaf.TemplateRepository.getTemplate(TemplateRepository.java:245)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1104)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1060)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1011)
    at org.thymeleaf.spring4.view.ThymeleafView.renderFragment(ThymeleafView.java:335)

我可以看到 jar 中包含 /templates/**。我觉得内容还可以。

一个可能(?)因素可能是我使用了一个引用布局的html页面,因此:

  layout:decorator="layouts/main"

我可以确认文件在 jar 中。

/login 是这样定义的:

@Override
public void addViewControllers(ViewControllerRegistry registry) 
    registry.addViewController("/login").setViewName("/login");
    registry.addViewController("/").setViewName("/login");

我将 Spring Security 配置为:

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter 

@Override
public void configure(WebSecurity security) 
    security.ignoring().antMatchers("/assets/**");


@Override
protected void configure(HttpSecurity http) throws Exception 
    http
            .csrf().disable();
    http
            .authorizeRequests()
            .antMatchers("/").permitAll()
            .anyRequest().authenticated();
    http
            .formLogin()
            .loginPage("/login")
            .defaultSuccessUrl("/home")
            .failureUrl("/login?error")
            .permitAll()
            .and()
            .logout()
            .invalidateHttpSession(true)
            .logoutSuccessUrl("/login?logout")
            .permitAll();


我认为这就是与这个问题相关的全部内容......

我见过https://github.com/spring-projects/spring-boot/issues/112 和Proper location of Thymeleaf views for Spring(以及其他)。尽管有这些资源,我还没有成功地让模板解析工作。

任何建议都非常感谢。

到目前为止,Spring Boot 还没有遇到最后一个障碍(接近最终部署),这很麻烦。

【问题讨论】:

没有什么明显的事情发生在我身上,Spring Boot 有一个使用 Thymeleaf 和布局的示例 (github.com/spring-projects/spring-boot/tree/master/…),所以我认为这不是问题所在。或许查看示例可以帮助您发现应用设置的差异? 【参考方案1】:

我在默认配置下使用带有百里香叶的 spring boot 时遇到了同样的问题。在我必须尝试 .jar 之前,一切正常

消息说: ... org.thymeleaf.exceptions.TemplateInputException:解析模板“/fragments/footer”时出错

我解决了玩 / ,问题是他们不需要斜线。

我改变了这个:

<footer class="footers" th:replace="/fragments/footer :: footer">

为此:

<footer class="footers" th:replace="fragments/footer :: footer">

【讨论】:

我遇到了同样的错误,由于您的回答,我能够修复它,所以谢谢。 不仅如此,在某些情况下区分大小写也是一个问题。从开发到生产(从 Windows 到 linux),片段名称在引用中有驼峰式大小写,但它本身都是小写的。还有一件事需要注意。 你拯救了我的一天。我的问题是控制器返回的字符串路径涉及像"/static/some.js" 这样的斜杠,删除斜杠对 jar 效果很好。【参考方案2】:

答案似乎在这里:https://github.com/spring-projects/spring-boot/issues/1744

简而言之:如果资源路径包含'//',事情就会出错。

解决方法是修改application.yml:

spring:
  thymeleaf:
    prefix: classpath:/templates

(当然,修复与 .properties 文件类似)

连锁效应是所有对模板或任何内容的引用都需要以斜线开头,如(Thymeleaf .html 文件):

      layout:decorator="/layouts/main"

或(Groovy 控制器):

@RequestMapping(value = "/home", method = RequestMethod.GET)
def home(Model model, Principal principal) 

    "/home/home"

认为弹簧靴应该可以解决这个问题。紧急。这是非常糟糕的人体工程学设计,会在让人感觉接近最终部署的时候严重爆炸。

【讨论】:

感谢您发布此信息。最终对我有用的是在我的属性中添加斜杠。 spring.thymeleaf.prefix=classpath:/templates/ 不幸的是,这对我没有解决,有完全相同的问题。 Eclipse 工作,可执行 jar 无法解析模板... :-( 我遇到了同样的问题“org.thymeleaf.exceptions.TemplateInputException:错误解析模板“ui/applications”,模板可能不存在或可能无法被任何配置的模板解析器访问”部署时weblogic中的spring boot admin。我可以成功登录,但是获取服务列表的请求“/admin/ui/applications”有问题。我尝试在“spring.thymeleaf.prefix:classpath:/templates”上方添加配置,但没有奏效。有什么配置可以解决这个问题?【参考方案3】:

好的,我找到了您必须仔细查看的地方。在您的 Controller 类中,当您在类上使用 @RequestMapping 时,没有前导斜杠(例如 @RequestMapping("property"))。在方法上,您需要一个前导斜杠(例如@GetMapping("/list"))并且返回值没有前导斜杠(例如return "property/list";

示例片段

@Controller
@RequestMapping("property")
public class PropertyController 
    @NonNull PropertyService service;

    @GetMapping("/list")
    public String list() 
        return "property/list";
    

【讨论】:

【参考方案4】:

我在使用 spring-boot-starter-thymeleaf 依赖项时遇到了问题

所以我改用了下面的依赖,

        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf</artifactId>
            <version>3.0.9.RELEASE</version>
        </dependency>

【讨论】:

【参考方案5】:

如果上述解决方案不适合你,像我一样,

我将控制器更改为 RestController。它解决了我的问题。

如果您使用 Angular 之类的前端应用程序与您的后端应用程序对话。

【讨论】:

欢迎来到SO,请详细描述你的答案,比如带一些代码示例,以便用户更好地理解你的答案【参考方案6】:

spring.thymeleaf.prefix=classpath:/templates/

改变

@Override
public void addViewControllers(ViewControllerRegistry registry) 
    registry.addViewController("/login").setViewName("/login");
    registry.addViewController("/").setViewName("/login");

@Override
public void addViewControllers(ViewControllerRegistry registry) 
    registry.addViewController("/login").setViewName("login");
    registry.addViewController("/").setViewName("login");

视图名称应该是相对路径

【讨论】:

【参考方案7】:

经过多次尝试后,我找到了解决模板错误问题的方法。我不知道是否与新版本的 spring-boot 有关,但我的更改有效。

每个请求都通过控制器而不是返回String“/login”,例如我改创建一个对象ModelAndView:

@RequestMapping(value="/login", method=RequestMethod.GET)
public ModelAndView login() 
    ModelAndView mv = new ModelAndView("login");
    return mv;

拥抱所有人。

【讨论】:

【参考方案8】:

对我来说,我的代码没有任何问题。我所做的只是在终端中运行mvn clean 命令,然后再次重新启动应用程序,它运行良好。

【讨论】:

这是作为答案发布的,但并不试图回答这个问题。可能应该是评论【参考方案9】:

这个问题与@Restcontroller 有关,因为@RestController 注释是@responseBody 和@controller 注释的混合

RestController 默认响应正文是 json 或字符串格式,无论添加什么字符串 html 名称,都将其视为字符串,然后在默认 html 中显示字符串

把@restController改成@controller就可以了

【讨论】:

以上是关于从 jar 运行时,Spring Boot 给出“TemplateInputException:解析模板错误”的主要内容,如果未能解决你的问题,请参考以下文章

尝试从 jar 文件运行时,Spring Boot 应用程序不会运行

从 jar 运行时 CSS 未在 Spring Boot 中加载

使用胖 Jar 插件和 Spring Boot 应用程序构建的 Gradle 给出“应用程序启动失败”

了解 STS:Spring Boot 应用程序在 STS 中运行良好,但使用 gradle 构建 jar 时,构建失败

启动jar时出现spring boot错误404

使用 Spring Boot Maven 插件时,jar 文件中缺少 Spring Boot 应用程序中的资源