SpringBoot 在生产中没有找到错误模板,尽管它在 Netbeans 中找到了它

Posted

技术标签:

【中文标题】SpringBoot 在生产中没有找到错误模板,尽管它在 Netbeans 中找到了它【英文标题】:SpringBoot does not find error templates in production although it finds it in Netbeans 【发布时间】:2019-10-25 10:43:06 【问题描述】:

在开发期间(在 Netbeans 下),例如一个内部服务器错误出现在我的 java SpringBoot(2.1.3) 项目中,我得到了一个名为 500.html 的错误页面,它位于 src/main/resources/templates/error/500.html 中:

然而,当部署在生产环境中时,500.html(404.html 相同)由于

而没有显示

org.thymeleaf.exceptions.TemplateInputException:解析模板时出错 [/error/500],模板可能不存在或可能无法被任何已配置的模板解析器访问

虽然模板位于 jar 的 /BOOT-INF/classes/templates/error/ 文件夹中:

这些模板在错误控制器中被调用:

@Controller
public class MyErrorController implements ErrorController 

    @RequestMapping("/error")
    public String handleError(Model model, HttpServletRequest request) 
        Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);

        if (status != null) 
            Integer statusCode = Integer.valueOf(status.toString());

            model.addAttribute("errorCode",
                    statusCode);

            if (statusCode == HttpStatus.NOT_FOUND.value()) 
                return "/error/404";
             else if (statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) 
                return "/error/500";
            

        

        return "/error/error";
    

    @Override
    public String getErrorPath() 
        return "/error";
    

我的项目pom.xml 具有spring-boot-maven-plugin,定义如下:

<plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.1.3.RELEASE</version>                
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

请注意:可以找到所有其他模板。

我阅读了this other SO question,但我的项目树似乎是正确的。

我应该怎么做才能让 SpringBoot 找到我的错误模板?

任何帮助表示赞赏,

【问题讨论】:

【参考方案1】:

在控制器上面的错误页面路径是错误的。路径不应以/ 开头。所以不是

 if (statusCode == HttpStatus.NOT_FOUND.value()) 
                return "/error/404";
             else if (statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) 
                return "/error/500";
            

        

        return "/error/error";

控制器应该是(没有前导/):

 if (statusCode == HttpStatus.NOT_FOUND.value()) 
                return "error/404";
             else if (statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) 
                return "error/500";
            

        

        return "error/error";

请注意getErrorPath() 中仍应有一个前导/,如Baeldung's post 所示:

@Override
    public String getErrorPath() 
        return "/error";
    

【讨论】:

以上是关于SpringBoot 在生产中没有找到错误模板,尽管它在 Netbeans 中找到了它的主要内容,如果未能解决你的问题,请参考以下文章

Django - 在此服务器上未在生产中找到资源

如何在将要在生产中呈现的模板中使用“dump()”twig 函数?

自动布局约束在生产中引发异常

在没有 Traceur 的情况下在生产中使用 SystemJS

PHP DOMNodeList错误:在开发人员中有效,但在生产中无效

是否应该在生产中禁用弹簧启动/云执行器?