【问题标题】:Controller based error pages spring thymeleaf基于控制器的错误页面spring thymeleaf
【发布时间】:2017-10-18 09:33:24
【问题描述】:

我已经设法构建静态错误页面并使用此 bean 重定向到它们:

    @Bean
    public EmbeddedServletContainerCustomizer containerCustomizer() {

        return new EmbeddedServletContainerCustomizer() {
            @Override
            public void customize(ConfigurableEmbeddedServletContainer container) {
                if (optiuniEnvironment.equals("development")) {
                    ErrorPage error401Page = new ErrorPage(HttpStatus.UNAUTHORIZED, "/401.html");
                    ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/404.html");
                    ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/404.html");

                    container.addErrorPages(error401Page, error404Page, error500Page);
                }
            }
        };
    }

但是,现在我想构建一个使用控制器功能的自定义页面。

所以在我的控制器中我有类似的东西

    @RequestMapping("/404.html")
    String pageNotFound(Model model, HttpServletRequest request)
    {
        return "404";
    }

如果我遇到 HttpStatus 404 并希望重定向到它。

我相信答案是配置 DispatcherServlet,但不确定。 有任何想法吗?谢谢!

(如果可能,请使用基于java的配置,而不是xml)

【问题讨论】:

  • 如果您使用的是 spring,为什么不实现异常处理程序?
  • 这就是问题所在。使用什么(以及如何使用)。我来看看异常处理程序。

标签: java spring thymeleaf custom-error-pages


【解决方案1】:

SpringBoot 版本的解决方案:1.2 - 即使不是最好的 - 现在已经足够了。

创建了一个 GlobalErrorController

@RestController
@Profile("prod")
public class GlobalErrorController implements ErrorController {

    private static final String PATH = "/error";

    @RequestMapping(value = PATH)
    public void error(HttpServletResponse response) throws IOException {
        int status = response.getStatus();
        switch (status) {
            case 404:
                response.sendRedirect("/404");
                break;
            case 401:
                response.sendRedirect("/401");
                break;
            case 403:
                response.sendRedirect("/401");
                break;
            default:
                response.sendRedirect("/404");
        }

    }

    @Override
    public String getErrorPath() {
        return PATH;
    }
}

在我的 HomeController 中我添加了:

@RequestMapping("404")
String get404ErrorPage() {
    return "404";
}

@RequestMapping("401")
String get401ErrorPage() {
    return "401";
}

我选择这种方法是因为我需要在错误页面中使用控制器的一些功能。

非常欢迎其他解决方案!

【讨论】:

    【解决方案2】:

    您可以使用以下方法处理这些错误:

    1。在同一个控制器中使用异常处理方法:

    @ExceptionHandler(NoHandlerFoundException.class)
    public String handle404Exception(NoHandlerFoundExceptionex) {
         //do whatever you want
         return "viewName";
    }
    

    2。创建异常控制器

    @ControllerAdvice
    public class ExceptionController {
    
        @ExceptionHandler(NoHandlerFoundException.class)
        public String handle404Exception(NoHandlerFoundExceptionex) {
             //do whatever you want
             return "viewName";
        }
    }
    

    如果使用 Spring Boot,请在 application.properties 中设置以下属性

    server.error.whitelabel.enabled=false
    spring.mvc.throw-exception-if-no-handler-found=true
    spring.resources.add-mappings=false
    

    3。添加错误页面注册器:

    @Bean
    public ErrorPageRegistrar errorPageRegistrar(){
        return new CustomErrorPageRegistrar();
    }
    
    private static class CustomErrorPageRegistrar implements ErrorPageRegistrar {
    
        // Register your error pages and url paths.
        @Override
        public void registerErrorPages(ErrorPageRegistry registry) {
            registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400"));
        }
    
    }
    

    并为各个 url 定义您的控制器端点(例如 /400)

    【讨论】:

    • 我假设您的解决方案有效,但是我使用的是 spring boot 1.2.0.RELEASE 并且现在无法更新,因此此属性不可用。不过,感谢您的意见。
    • @Irikos 检查第三个选项(现在添加),它可能会起作用!
    • 嘿 Afridi,我尝试了前两种解决方案但没有奏效(但我无法使用 resource.add-mappings=false 属性,因为它毁了我的整个应用程序)。它没有将我重定向到经典的白标签页面,但也没有将我重定向到自定义页面。对于第三个,我相信需要弹簧靴弹簧靴 1.4(我有 1.2)。尽管如此,受此启发,我找到了一个解决方案,即使不是最好的。我会尽快发布。
    猜你喜欢
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 2014-12-04
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多