从 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 给出“应用程序启动失败”