SpringBoot整合Freemarker模板的两个错误

文章目录

    • 错误汇总
      • 一、无法找到对应的模板路径
      • 二、无法解析 Freemarker 模板

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

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

错误汇总

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

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

日志信息:

SpringBoot整合Freemarker模板的两个错误_第1张图片

报错原因:

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

解决方法:

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

例如:

@EnableWebMvc
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

二、无法解析 Freemarker 模板

报错信息:

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。

spring:
  freemarker:
    charset: UTF-8
    template-loader-path: classpath:/templates/
    content-type: text/html
    suffix: .ftlh
    prefer-file-system-access: false

你可能感兴趣的:(Spring,java,spring,spring,boot,web)