为什么我的弹簧启动错误控制器不起作用?

时间:2018-05-03 12:50:27

标签: java spring-mvc spring-boot error-handling

我有一个简单的Spring启动Web应用程序(在Tomcat下运行),我无法弄清楚如何让错误处理程序工作。到目前为止,我已经创建了Web应用程序和控制器,它们都运行良好。也就是说,它们显示Thymeleaf模板。出错了。我收到了默认的白标错误页面。

我首先通过添加EnableAutoConfiguration注释来禁用此白标错误页面,因此:

@SpringBootApplication(scanBasePackages="au.com.sample")
@EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class})
public class SampleWebApp extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(SampleWebApp.class);
    }
}

现在,如果我浏览到一个未知页面,我会得到一个包含以下内容的通用404 HTML错误页面:

<html>...<body><h1>HTTP Status 404 – Not Found</h1></body></html>

这一步有效。现在,当我尝试添加自己的错误控制器时,当我浏览到不存在的终点时,它不会触发:

@Controller
@RequestMapping("/")
public class ErrorHandlingController implements ErrorController {
    @Override
    public String getErrorPath() {
        return "/error";
    }

    @RequestMapping(/"error")
    public ModelAndView handleError() {
        ModelAndView mav = new ModelAndView();
        mav.addObject("title", "Error");
        mav.setViewName("layout");
        return mav;
    }
}

"layout"是我现有的百日咳模板,适用于我的其他终点。

我尝试了多种错误控制器,例如。使用"error"而不是"/error"将端点更改为@RestController(而非@Controller),但没有运气。在每种情况下,我都使用相同的通用404 HTML而不是我手工制作的模板。

任何人都可以看到我做错了什么或者有关于如何追踪我的问题的任何提示。

2 个答案:

答案 0 :(得分:2)

在Spring Boot中显示特定状态的自定义错误页面非常简单。只需在<error-code>.html目录中添加src/main/resources/templates/errors即可解析它。或者添加通用error.html作为后备。有关此功能,请参阅the reference guide(另请参阅this)。

如果要添加自己的错误处理,只需添加类型为ErrorController的bean,或者如果只想添加属性,请在配置中添加ErrorAttributes类型的bean。有关详细信息,请参阅this section

答案 1 :(得分:1)

关于为什么Spring不调用错误控制器的原始问题的最新答案:我认为您正在排除使自定义ErrorController起作用的魔力。在Spring-Boot v2.1.6应用程序中,我必须允许(但不排除)ErrorMvcAutoConfiguration类,然后在页面未找到等情况下使用了自定义MyController-implements-ErrorController类。 。我认为,如果您使用Thymeleaf模板并且已经在template /目录中发布了模板文件,则应该只排除ErrorMvc ..类,因为在这种情况下,您实际上不需要自定义错误控制器。 HTH。