每一秒钟的时间都值得铭记

0%

SpringBoot整合Freemarker模板的两个错误

之前的项目一直都在写 RESTFUL 风格的 API 接口,使用 Json 格式的数据和前端进行通信,但是最近因为一些特殊原因,需要在后端直接返回一个页面。

结果在整合 Freemarker 模板引擎的时候发生了各种报错,在这里将报错原因和解决方法分享给各位同学。

错误汇总

一、无法找到对应的模板路径

请求到达服务后端之后,Controller 返回了对应的视图名称,但是 DispatcherServlet 却爆出 Completed 404 NOT_FOUND,显示无法找到对应的模板页面。

日志信息:

在这里插入图片描述

报错原因:

这个报错原因是因为 SpringBoot 版本导致的,我以前集成 Freemarker 模板,使用的 SpringBoot 版本是 2.0.6.RELEASE,但是现在项目中 SpringBoot 的版本是 2.3.8.RELEASE。而高版本的 SpringBoot 是不会自动注入 SpringMVC 相关的配置的,所以导致无法找到对应的模板资源路径。
最终报错 404。

解决方法:

如果使用 2.3.8.RELEASE 版本的 SpringBoot,需要在配置类中加上 @EnableWebMvc 注解,使用了该注解,则会自动配置 SpringMVC 相关的配置。

例如:

1
2
3
4
5
6
7
@EnableWebMvc
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}

二、无法解析 Freemarker 模板

报错信息:

1
2
3
4
5
6
7
8
9
10
javax.servlet.ServletException: Could not resolve view with name 'oauth-login' in servlet with name 'dispatcherServlet'
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1353)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)

这个报错信息是因为无法找到 Freemarker 模板文件,导致无法解析正确的视图。

报错原因:

这个报错原因是因为,我的项目使用的是多模块开发,我通过 DEBUG,发现 Freemarker 视图解析的路径,是另一个模块的路径,而需要解析的 Freemarker 模板文件则在当前的模块。

解决方法:

配置 Freemarker 的 preferFileSystemAccess 属性为 false,该属性默认为 true。

1
2
3
4
5
6
7
spring:
freemarker:
charset: UTF-8
template-loader-path: classpath:/templates/
content-type: text/html
suffix: .ftlh
prefer-file-system-access: false
坚持原创技术分享,您的支持将鼓励我继续创作!
-------------这是我的底线^_^-------------