我@ExceptionHandler
用来处理我的网络应用程序抛出的异常,在我的情况下,我的应用程序返回JSON
响应,以HTTP status
获取对客户端的错误响应。
但是,我试图弄清楚如何处理error 404
以返回类似的 JSON 响应,就像由@ExceptionHandler
更新:
我的意思是,当访问一个不存在的 URL 时
我@ExceptionHandler
用来处理我的网络应用程序抛出的异常,在我的情况下,我的应用程序返回JSON
响应,以HTTP status
获取对客户端的错误响应。
但是,我试图弄清楚如何处理error 404
以返回类似的 JSON 响应,就像由@ExceptionHandler
更新:
我的意思是,当访问一个不存在的 URL 时
我使用 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 > 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();
}
}
}
找出最简单的方法是使用以下方法:
@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 提供“/”映射,以便处理特定服务器实例的所有映射。
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。
您可以使用 servlet 标准方式来处理 404 错误。在里面添加以下代码web.xml
<error-page>
<exception-type>404</exception-type>
<location>/404error.html</location>
</error-page>