【问题标题】:Handle error 404 with Spring controller使用 Spring 控制器处理错误 404
【发布时间】:2012-11-01 15:13:28
【问题描述】:

我使用@ExceptionHandler 来处理我的网络应用程序抛出的异常,在我的例子中,我的应用程序返回JSON 响应和HTTP status 以获取对客户端的错误响应。

但是,我试图弄清楚如何处理 error 404 以返回与 @ExceptionHandler 处理的类似的 JSON 响应

更新:

我的意思是,当访问一个不存在的 URL 时

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:
    public final class ResourceNotFoundException extends RuntimeException {
    
    }
    
    
    @ControllerAdvice
    public class AppExceptionHandler {
        @ExceptionHandler(ResourceNotFoundException.class)
        @ResponseStatus(HttpStatus.NOT_FOUND)
        public String handleNotFound() {
            return "404";
        }
    }
    

    只需定义一个 Exception,一个 ExceptionHandler,从您的业务代码控制器中抛出 Exception。

    【讨论】:

    • 这在我的 Spring 4 应用程序中完美运行,并且是为 NoHandlerFoundException 等 Spring 原生异常设置状态代码的合适解决方案。
    【解决方案2】:

    我使用 spring 4.0 和 java 配置。我的工作代码是:

    @ControllerAdvice
    public class MyExceptionController {
        @ExceptionHandler(NoHandlerFoundException.class)
        public ModelAndView handleError404(HttpServletRequest request, Exception e)   {
                ModelAndView mav = new ModelAndView("/404");
                mav.addObject("exception", e);  
                //mav.addObject("errorcode", "404");
                return mav;
        }
    }
    

    在 JSP 中:

        <div class="http-error-container">
            <h1>HTTP Status 404 - Page Not Found</h1>
            <p class="message-text">The page you requested is not available. You might try returning to the <a href="<c:url value="/"/>">home page</a>.</p>
        </div>
    

    对于初始化参数配置:

    public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
        @Override
        public void customizeRegistration(ServletRegistration.Dynamic registration) {
            registration.setInitParameter("throwExceptionIfNoHandlerFound", "true");
        }
    }
    

    或通过xml:

    <servlet>
        <servlet-name>rest-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>throwExceptionIfNoHandlerFound</param-name>
            <param-value>true</param-value>
        </init-param>
    </servlet>
    

    另请参阅:Spring MVC Spring Security and Error Handling

    【讨论】:

    • 这是最好的答案,因为使用 Spring 处理所有内容都允许您使用 Java 与静态 html 页面处理错误所带来的所有功能。
    • 谢谢你,这似乎是现在做事的正确方法,但是,它对我不起作用。如果你有时间,你有没有机会告诉我我做错了什么? stackoverflow.com/questions/28750038/…
    • 如果您配置了资源处理程序并且找不到资源,那么这不起作用。不幸的是,ResourceHttpRequestHandler 发送一个 404 响应,而不是抛出某种你可以捕获的资源异常。
    • 如果它不起作用this is a solution
    • 太棒了。对我来说,问题是缺少初始化参数配置的信息。这就是几乎总是缺少的!
    【解决方案3】:

    找出最简单的方法是使用以下方法:

    @ExceptionHandler(Throwable.class)
      public String handleAnyException(Throwable ex, HttpServletRequest request) {
        return ClassUtils.getShortName(ex.getClass());
      }
    

    如果 URL 在 DispatcherServlet 的范围内,则此方法将捕获由错误输入或其他任何原因引起的任何 404,但如果输入的 URL 超出 DispatcherServlet 的 URL 映射,则您必须使用:

    <error-page>
       <exception-type>404</exception-type>
       <location>/404error.html</location>
    </error-page>
    

    为您的 DispatcherServlet 映射 URL 提供“/”映射,以便处理特定服务器实例的所有映射。

    【讨论】:

    • 这对我不起作用:我为我的 DispatcherServlet 设置了“/”映射,但没有触发该方法...
    • 请求进来的方法是同一个类还是父类?
    • 不,我正在尝试设置一个全局处理程序...(stackoverflow.com/q/21884740/1061499
    【解决方案4】:

    您可以使用 servlet 标准方式来处理 404 错误。在web.xml中添加以下代码

    <error-page>
       <exception-type>404</exception-type>
       <location>/404error.html</location>
    </error-page>
    

    【讨论】:

      【解决方案5】:

      使用 spring > 3.0 使用 @ResponseStatus

        @ResponseStatus(value = HttpStatus.NOT_FOUND)
        public class ResourceNotFoundException extends RuntimeException {
          ...
      }
      
          @Controller
          public class MyController {
          @RequestMapping.....
          public void handleCall() {
              if (isFound()) {
              // do some stuff
              }
              else {
                    throw new ResourceNotFoundException(); 
              }
          }
      }
      

      【讨论】:

      • 我的意思是,当访问一个不存在的 URL 时
      • 404 或 Not Found 错误消息是一个 HTTP 标准响应代码,表示客户端能够与服务器通信,但服务器找不到请求的内容。
      • 我的意思是,例如这个 url 存在:/rest/doc/1
      • 好的,我想你可以在这里找到答案,然后stormpath.com/blog/…
      猜你喜欢
      • 2016-11-06
      • 1970-01-01
      • 2014-05-25
      • 2020-10-11
      • 2018-10-04
      • 2015-06-24
      • 2019-08-14
      • 2016-06-05
      相关资源
      最近更新 更多