2010-11-19 25 views
15

No puedo entender cómo manejar más de un tipo de excepción por @ExceptionHandler.Spring @ExceptionHandler manejando múltiples tipos de excepciones

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

No puedo poner todas las referencias de excepción como argumentos para el método del controlador, no tendría sentido, no se puede tratar programáticamente. Necesito una referencia común para que pudiera usar "instanceof" en él o simplemente enviarlo a otro lugar como una "excepción" en 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: ¿y si yo quería manejar org.springframework.web.multipart .MaxUploadSizeExceededException, que no se arroja desde ningún método del controlador? Porque @ExceptionHandler solo captura las excepciones que se lanzan desde uno de los métodos del controlador.

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

agradecería cualquier ayuda, me estoy volviendo loco, esto es muy frustrante ....

Respuesta

15

El valor @ExceptionHandler se puede ajustar a una variedad de tipos de excepción. Si se lanza una excepción que coincida con uno de los tipos en 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. Vea el documentation para más detalles.

0

Su pregunta es bastante confusa, pero su método de gestión de excepciones sólo se manejará una excepción a la vez. No detectará múltiples 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 manejo 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... 

Por favor refiérase a la documentación de primavera para más información:

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

+0

sí quiero manejarlos de la misma manera. Los pongo en sessionErrors y viewlayer y javascript los maneja de manera diferente a continuación. Lo que quería saber es si la muestra mía es correcta, porque el método handleFormException no captura la excepción de uno de los tipos mencionados en la lista de valores de anotación ... – lisak

+0

si declaro un método para un tipo de excepción, funciona ... es raro ... Por cierto, ¿sabes cómo manejar las excepciones que se arrojan fuera del controlador? Me refiero al uso de @ExceptionHandlers ... Cuando hice la pregunta adicional ... – lisak

17

Acabo de agregar a NimChimpsky answer "El valor de @ExceptionHandler se puede establecer en una matriz de tipos de excepción". La puesta en práctica de la utilización de gama excepción como se menciona en la primavera documentation será como

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

Cuestiones relacionadas