19

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

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

更新:

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

4

5 回答 5

46

我使用 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 安全性和错误处理

于 2014-12-01T08:07:51.303 回答
7

使用 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(); 
        }
    }
}
于 2012-11-13T06:52:02.557 回答
4

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

@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 提供“/”映射,以便处理特定服务器实例的所有映射。

于 2012-11-13T11:23:13.907 回答
3
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。

于 2017-10-12T07:51:24.393 回答
1

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

<error-page>
   <exception-type>404</exception-type>
   <location>/404error.html</location>
</error-page>
于 2012-11-13T09:28:28.107 回答