【问题标题】:404 error redirect in Spring MVC with java config使用 java config 在 Spring MVC 中重定向 404 错误
【发布时间】:2016-08-12 06:53:17
【问题描述】:

我有一个简单的 Spring MVC 应用程序,我想处理 404 Not found exceptions in my Advice Controller 类

配置:

   public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {


    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[]{WebConfig.class};
    }


    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{RootConfig.class, SecurityConfig.class};
    }


    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }


    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);
        servletContext.addListener(new SessionListener());
        FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("encodingFilter", new CharacterEncodingFilter());
        encodingFilter.setInitParameter("encoding", "UTF-8");
        encodingFilter.setInitParameter("forceEncoding", "true");
        encodingFilter.addMappingForUrlPatterns(null, true, "/*");
    }
}

控制器:

@Controller
@RequestMapping("/")
public class HomeController {
 @RequestMapping(value = "/error/", method = RequestMethod.GET)
    public String error(){return "error";}
}

控制器建议:

@ControllerAdvice
public class AdviceController {

    @ExceptionHandler(MyOwnException.class)
    @ResponseStatus(value= HttpStatus.BAD_REQUEST)
    public String checkoutException(CheckoutException e, HttpServletRequest httpServletRequest)   {
                return "error";
    }
}

当我手动抛出 MyOwnException 时,我可以捕获自己的异常,但我不知道如何捕获 NoHandlerFound 异常。当没有控制器方法来处理请求时,我需要发送 404 错误代码和适当的 error.jsp 页面

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    如果您的 webapp 使用 web.xml,这非常简单 - 只需添加以下内容(假设使用 InternalResourceViewResolver 前缀指向您的 WEB-INF 视图文件夹和后缀.jsp)。您也可以有多个其他错误代码的错误页面元素。

    <error-page>
        <error-code>404</error-code>
        <location>/error</location>
    </error-page>
    

    如果您不使用web.xml,它会更复杂,您必须定义和注册自己的ExceptionResolver。请查看此spring.io blog article,了解如何执行此操作的详细信息。


    (评论后编辑)

    如果你想捕获NoHandlerFound 异常,你首先必须告诉Spring 通过setting a flag in the DispatcherServlet directly 抛出它。为此,请在您的 AppInitializer 类中添加 DispatcherServlet 定义,然后添加您当前正在执行的操作以添加标志:

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);
        servletContext.addListener(new SessionListener());
        //BEGIN OF NEW CODE
        WebApplicationContext context = getContext();
        DispatcherServlet dispatcherServlet = new DispatcherServlet(context);
        //we did all this to set the below flag
        dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet",dispatcherServlet );
        //END OF NEW CODE
        FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("encodingFilter", new CharacterEncodingFilter());
        encodingFilter.setInitParameter("encoding", "UTF-8");
        encodingFilter.setInitParameter("forceEncoding", "true");
        encodingFilter.addMappingForUrlPatterns(null, true, "/*");
    }
    

    然后你可以直接在AdviceController 中捕获 NoHandlerFound 异常:

    @ControllerAdvice
    public class AdviceController {
        //..
        @ExceptionHandler(NoHandlerFoundException.class)
        public String dealWithNoHandlerFoundException(CheckoutException e, HttpServletRequest httpServletRequest)   {
                    return "error";
        }
    }
    

    【讨论】:

    • 我想捕捉 Spring MVC 标准的 NoHandlerFound 异常。貌似默认没有抛出过
    • @VadOs 我已经编辑了我的答案以添加有关如何捕获 NoHandlerFound 异常的更多信息
    • 感谢您的帮助,但它不起作用((我看到相同的标准错误页面((
    • 看起来这个配置一点用都没有@Override protected DispatcherServlet createDispatcherServlet(WebApplicationContext servletAppContext) { final DispatcherServlet dispatcherServlet = super.createDispatcherServlet(servletAppContext); dispatcherServlet.setThrowExceptionIfNoHandlerFound(true); return dispatcherServlet; }
    • 终于成功了。谢谢。问题是 DefaultServletHadlerConfigurer @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } 我删除了它,它现在可以工作了
    猜你喜欢
    • 1970-01-01
    • 2014-06-27
    • 2014-12-12
    • 2019-07-28
    • 2017-05-10
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    相关资源
    最近更新 更多