restcontrolleradvice manejo excepciones example error controlleradvice spring exception-handling

manejo - spring response exception handler



Spring @ExceptionHandler manejando mĂșltiples tipos de excepciones (4)

No puedo descubrir cómo manejar más de un tipo de excepción por @ExceptionHandler.

Necesito lidiar programáticamente con estas excepciones, para esto necesitaría una referencia compartida. ¿Se hace esto a través de esta referencia "Excepción ex"? No lo creo, porque la excepción no se captura de esta manera, ¿cómo lo haría entonces?

No puedo poner todas las referencias de excepción como argumentos al método del controlador, no tendría sentido, no se puede tratar mediante programación. Necesito una referencia compartida para poder usar "instanceof" en ella o simplemente enviarla a otro lugar como una "Excepción" general

@ExceptionHandler({DescriptionCstOrderException.class, SpecializationCstOrderException.class, NoUploadFileException.class, DeadLineCstOrderException.class, DocumentCstOrderException.class, CommentCstOrderException.class}) public String handleFormException(Exception ex, ActionRequest actionRequest) { logger.error(ex.getMessage()); SessionErrors.add(actionRequest, ex.getClass().getName()); return "mainOrderForm"; }

Pregunta adicional: ¿qué pasa si quisiera manejar org.springframework.web.multipart.MaxUploadSizeExceededException, que no se arroja desde ningún método del controlador? Porque @ExceptionHandler captura solo las excepciones que se generan desde uno de los métodos de controlador.

El método exceptionHandler podría colocarse en algún controlador principal extendido, pero si uno usa solo defaultAnnotationHandlerMapping ...?

Aprecio cualquier ayuda, me estoy volviendo loco, esto es muy frustrante ...


El valor de @ExceptionHandler se puede establecer en una matriz de tipos de excepción.

La implementación del uso de la matriz de excepciones como se menciona en la documentation Spring será como

@ExceptionHandler({ NotFoundException.class, MissingServletRequestParameterException.class })


El valor de @ExceptionHandler se puede establecer en una matriz de tipos de excepción. Si se lanza una excepción coincide con uno de los tipos de la lista, se invocará el método anotado con el @ExceptionHandler correspondiente. Si el valor de la anotación no se establece, se utilizan los tipos de excepción enumerados como argumentos de método. Consulte la documentation para más detalles.


Me encontré con este mismo problema. El problema realmente surgió cuando intenté integrar los métodos de Bugsnag. Bugsnag adjunta su hilo al Thread.UncaughtExceptionHandler y si el Thread.UncaughtExceptionHandler ya está manejado por otro mecanismo (en mi caso: AopUtils with InvocationTargetException), Bugsnag no podrá insertarlo en el panel de control del portal. Se suponía que Bugsnag funcionaría sin dañar el manejo de las Excepciones no Manejadas, si hubiera sido simple y no se hubiera manejado en ningún otro lugar dentro de Spring fw.

Ahora quería escribir un ExceptionHandler uniforme y encontré el @ControllerAdvice de Spring. Para un escenario, sé que NullPointerException de cualquier parte de la aplicación invoca la InvocationTargetException de AopUtil. Así que escribí un @ExceptionHandler manejando InvocationTargetException, pero ¿qué pasa con cualquier otro tipo de excepciones de RunTime? Eso puede resultar ser la pesadilla para la producción.

Simplemente quiero un mecanismo general que maneje cualquier tipo de excepción, lanzada desde cualquier parte de la aplicación, para simplemente converger a este método. Y creo que esto es exactamente lo que pidió @lisak. Pensamientos, alguien?


Su pregunta es bastante confusa, pero su método de control de excepciones solo manejará una excepción a la vez. No detectará varias excepciones y luego las pasará a su método handleFormException (). Si necesita manejar estos tipos de excepción de manera diferente, debe crear un método de control de excepciones para cada uno, especificar un argumento de ese tipo de excepción específico para su método y luego realizar el manejo apropiado. Por ejemplo:

@ExceptionHandler(DescriptionCstOrderException.class) public String handleDescriptionCstOrderException(DescriptionCstOrderException exception, ActionRequest actionRequest) {...} @ExceptionHandler(SpecializationCstOrderException.class) public String handleSpecializationCstOrderException(SpecializationCstOrderException exception, ActionRequest actionRequest) {...} // and so on...

Consulte la documentación de Spring para obtener más información:

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-exceptionhandler