404 错误重定向在 Spring 中使用 Java 配置

2022-09-01 15:21:27

如您所知,在 XML 中,配置此项的方法是:

<error-page>
    <error-code>404</error-code>
    <location>/my-custom-page-not-found.html</location>
</error-page>

但是我还没有找到在Java配置中做到这一点的方法。我尝试的第一种方法是:

@RequestMapping(value = "/**")
public String Error(){
    return "error";
}

它似乎有效,但它在检索资源时存在冲突。

有没有办法做到这一点?


答案 1

在Spring框架中,有许多处理异常(特别是404错误)的方法。这是一个文档链接

  • 首先,您仍然可以在网页.xml中使用代码,并自定义错误页面。下面是一个示例error-page
  • 其次,您可以对所有控制器使用一个控制器,如下所示:@ExceptionHandler

    @ControllerAdvice
    public class ControllerAdvisor {
    
         @ExceptionHandler(NoHandlerFoundException.class)
         public String handle(Exception ex) {
    
            return "404";//this is view name
        }
    }
    

    为此,请将 throwExceptionIfNoHandlerFound 属性设置为 true,for in web.xml:DispatcherServlet

    <init-param>
        <param-name>throwExceptionIfNoHandlerFound</param-name>
        <param-value>true</param-value>
    </init-param>
    

    您还可以将一些对象传递到错误视图,请参阅javadoc


答案 2

自 spring 4.2 RC3 以来最干净的解决方案是在类中使用新的钩子来扩展(或间接通过扩展),如下所示:createDispatcherServletAbstractDispatcherServletInitializerAbstractAnnotationConfigDispatcherServletInitializer

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    /* ... */

    @Override
    protected DispatcherServlet createDispatcherServlet(WebApplicationContext servletAppContext) {
        final DispatcherServlet dispatcherServlet = super.createDispatcherServlet(servletAppContext);
        dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
        return dispatcherServlet;
    }
}

然后,您可以使用全局(用 ) 进行注释的类,如参考文档中所述。在建议中,您可以按照此处所述处理。@ControllerAdvice@ControllerAdviceNoHandlerFoundException@ExceptionHandler

这可能看起来像这样:

@ControllerAdvice
public class NoHandlerFoundControllerAdvice {

    @ExceptionHandler(NoHandlerFoundException.class)
    public ResponseEntity<String> handleNoHandlerFoundException(NoHandlerFoundException ex) {
        // prepare responseEntity
        return responseEntity;
    }

}

推荐