Manejar el error 404 con el controlador de Spring

Utilizo @ExceptionHandler para manejar las excepciones lanzadas por mi aplicación web, en mi caso mi aplicación devuelve una respuesta JSON con HTTP status para las respuestas de error al cliente.

Sin embargo, estoy tratando de encontrar la forma de manejar el error 404 para devolver una respuesta JSON similar a la manejada por @ExceptionHandler

Actualizar:

Quiero decir, cuando se accede a una URL que no existe

La forma más simple de averiguarlo es usar lo siguiente:

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

Si la URL está dentro del scope de DispatcherServlet, cualquier 404 causado por errores ortográficos o cualquier otra cosa será capturado por este método, pero si la URL ingresada está más allá de la asignación de URL del DispatcherServlet, entonces debe usar:

  404 /404error.html  

o

Proporcione la asignación “/” a su URL de mapeo DispatcherServlet para manejar todas las asignaciones para la instancia de servidor particular.

Utilizo la spring 4.0 y la configuración de Java. Mi código de trabajo es:

 @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; } } 

En JSP:

  

HTTP Status 404 - Page Not Found

The page you requested is not available. You might try returning to the ">home page.

Para la configuración Init param:

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

O vía xml:

  rest-dispatcher org.springframework.web.servlet.DispatcherServlet  throwExceptionIfNoHandlerFound true   

Ver también: Spring MVC Spring Security and Error Handling

Con spring> 3.0 use @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(); } } } 
 public final class ResourceNotFoundException extends RuntimeException { } @ControllerAdvice public class AppExceptionHandler { @ExceptionHandler(ResourceNotFoundException.class) @ResponseStatus(HttpStatus.NOT_FOUND) public String handleNotFound() { return "404"; } } 

Simplemente defina una Exception, un ExceptionHandler, eche la excepción desde su controlador de código comercial.

Puede usar la forma estándar de servlet para manejar el error 404. Agregue el siguiente código en web.xml

  404 /404error.html