¿Cómo consigo un controlador Spring 3.0 para activar un 404?
Tengo un controlador con @RequestMapping(value = "/**", method = RequestMethod.GET)
y para algunas URL que acceden al controlador, quiero que el contenedor tenga un 404.
java
spring
spring-mvc
N / A.
fuente
fuente
@ResponseStatus
es que usted define un montón de clases de excepciones bien tipadas y bien nombradas, cada una con la suya propia@ResponseStatus
. De esa manera, desacoplas el código de tu controlador del detalle de los códigos de estado HTTP.@ResponseStatus(value = HttpStatus.NOT_FOUND, reason="Your reason")
ResourceNotFound.fillInStackTrace()
con una implementación vacía.A partir de Spring 5.0, no necesariamente necesita crear excepciones adicionales:
Además, puede cubrir múltiples escenarios con una excepción incorporada y tiene más control.
Ver más:
fuente
Vuelva a escribir su firma de método para que acepte
HttpServletResponse
como parámetro, de modo que pueda invocarlosetStatus(int)
.http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-arguments
fuente
setStatus(int)
javadoc dice lo siguiente: si este método se usa para establecer un código de error, entonces el mecanismo de la página de error del contenedor no se activará. Si hay un error y la persona que llama desea invocar una página de error definida en la aplicación web,sendError
debe usarse en su lugar.Me gustaría mencionar que hay una excepción (no solo) para 404 por defecto proporcionada por Spring. Consulte la documentación de Spring para más detalles. Entonces, si no necesita su propia excepción, simplemente puede hacer esto:
fuente
@PathVariable
de mi punto de vista, no hay manejo de solicitudes. ¿Crees que es mejor / más limpio usar tu propia Excepción anotada@ResponseStatus(value = HttpStatus.NOT_FOUND)
?Desde Spring 3.0.2 puede devolver ResponseEntity <T> como resultado del método del controlador:
(ResponseEntity <T> es una anotación más flexible que @ResponseBody - vea otra pregunta )
fuente
puede usar el @ControllerAdvice para manejar sus Excepciones. El comportamiento predeterminado de la clase anotada @ControllerAdvice ayudará a todos los Controladores conocidos.
por lo que se llamará cuando cualquier controlador que tenga arroje un error 404.
como el siguiente:
y mapee este error de respuesta 404 en su web.xml, como el siguiente:
Espero que ayude .
fuente
Si su método de controlador es para algo como el manejo de archivos, entonces
ResponseEntity
es muy útil:fuente
Si bien la respuesta marcada es correcta, hay una manera de lograr esto sin excepciones. El servicio devuelve
Optional<T>
el objeto buscado y esto se asigna aHttpStatus.OK
si se encuentra y a 404 si está vacío.fuente
Recomiendo lanzar HttpClientErrorException , como este
Debe recordar que esto solo se puede hacer antes de escribir algo en la secuencia de salida del servlet.
fuente
Whitelabel Error Page \n .... \n There was an unexpected error (type=Internal Server Error, status=500). \n 404 This is your not found error
Esto es un poco tarde, pero si está utilizando Spring Data REST, entonces ya existe.
org.springframework.data.rest.webmvc.ResourceNotFoundException
También utiliza@ResponseStatus
anotaciones. Ya no es necesario crear una excepción de tiempo de ejecución personalizada.fuente
Además, si desea devolver el estado 404 de su controlador, todo lo que necesita es hacer esto
Al hacer esto, recibirá un error 404 en caso de que desee devolver un 404 desde su controlador.
fuente
Simplemente puede usar web.xml para agregar código de error y página de error 404. Pero asegúrese de que la página de error 404 no debe ubicarse en WEB-INF.
Esta es la forma más sencilla de hacerlo, pero tiene algunas limitaciones. Suponga que si desea agregar el mismo estilo para esta página que agregó otras páginas. De esta manera no puedes hacerlo. Tienes que usar el
@ResponseStatus(value = HttpStatus.NOT_FOUND)
fuente
HttpServletResponse#sendError(HttpServletResponse.SC_NOT_FOUND); return null;
el código del controlador. Ahora, desde el exterior, la respuesta no se ve diferente a un 404 normal que no golpeó ningún controlador.Configure web.xml con la configuración
Crear nuevo controlador
fuente
Porque siempre es bueno tener al menos diez formas de hacer lo mismo:
fuente