为什么我的ControllerAdvice无法在spring boot

时间:2016-03-09 09:29:39

标签: spring-mvc spring-security spring-boot

我使用spring boot和spring security,我想为我的应用程序添加错误处理程序,这是我的ControllerAdvice:

@ControllerAdvice
public class GlobalExceptionController  {

    public static final String DEFAULT_ERROR_VIEW = "error";

    @ExceptionHandler(Exception.class)
    public ModelAndView defaultError(HttpServletRequest req, Exception e)
            throws Exception {

        if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null)
            throw e;
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", e);
        mav.addObject("url", req.getRequestURL());
        mav.setViewName(DEFAULT_ERROR_VIEW);
        return mav;
    }

}

这是我的代码段error.html代码(使用百日咳):

<div class="container">
        <h1 th:inline="text">Error</h1>
        <p th:text="${exception}"></p>
        <p th:text="${url}"></p>
</div>

和今年春天的安全配置代码段:

@Override
protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/login").permitAll().anyRequest()
        .fullyAuthenticated().and().formLogin().loginPage("/login")
        .failureUrl("/login?error").and().logout()
        .logoutRequestMatcher(new AntPathRequestMatcher("/logout")).and()
        .exceptionHandling().accessDeniedPage("/access?error");

}

如果我尝试访问我的应用程序使用错误的URL,GlobalExcetionController中的对象异常和url不会在error.html中呈现,为什么?

[UPDATE]

我的ControllerAdvice仅在错误404时才起作用,但是其他错误有效,如何设置ExceptionHandler来处理404错误?

1 个答案:

答案 0 :(得分:0)

[解决]

我将这个@Bean添加到我的spring boot config

@Bean
    public EmbeddedServletContainerCustomizer containerCustomizer() {
        return new EmbeddedServletContainerCustomizer() {
            @Override
            public void customize(ConfigurableEmbeddedServletContainer container) {

                ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND,
                        "/error404.html");
                container.addErrorPages(error404Page);

            }
        };
    }

for error404.html必须位于静态文件夹

感谢参考: http://www.sporcic.org/2014/05/custom-error-pages-with-spring-boot/