Spring Exception Handling - как использовать ExceptionResolver и @ExceptionHandler одновременно - PullRequest
3 голосов
/ 23 ноября 2010

Я разработал веб-приложение, в котором исключения проверки формы должны обрабатываться @ExceptionHandler (должен быть гибким), а общие системные исключения - SimpleMappingExceptionResolver (такие вещи, как уведомление по электронной почте и т. Д.).

Проблема в том, что, если я использую оба, исключения, которые сопоставлены для @ExceptionHandler, не попадают в @ExceptionHandler, но захватываются ExceptionResolver как defaultError.

Есть идеи, что нужно сделать, чтобы это работало вместе?

@ExceptionHandler(ValidatorException.class)
public String handleFormException(ValidatorException ex, ActionRequest actionRequest) {
    logger.error(ex.getMessage());
    //TODO make conditions
    return "mainOrderForm";
}

@ActionMapping(params = "action=addDocOrder")
public void addDocOrder(@ModelAttribute("order") CstOrderBeanImpl orderBean,
        BindingResult result, ActionRequest actionRequest, ActionResponse response) 
        throws PortalException, SystemException, ValidatorException {
    logger.info("Adding Form Order");
    Calendar cal = TimeUtils.getEuDeadLine(orderBean);
    orderBean.setDeadLine(cal.getTime());
    ValidatorException ve = validateService.validate(orderBean, result, actionRequest, validator);
    if (ve != null) throw ve;
(...)

В DispatcherPortlet есть

catch (Exception ex) {
    // Trigger after-completion for thrown exception.
    triggerAfterActionCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);
(...)

Который проверяет наличие перехватчиков, но ни один не существует, поэтому он выполняет настройку по умолчанию ...

Я просто отмечаю, что это среда портлетов, обычно меньше "просмотров" ... управляемых параметрами ..

Ответы [ 3 ]

2 голосов
/ 25 ноября 2010

Возможно, в качестве обходного пути в ExceptionResolver вы могли бы динамически вызывать метод обработчика по вашему выбору.

public ModelAndView resolveException(RenderRequest req, RenderResponse res, Object handler,Exception exc) {
    if(exc instanceof ValidatorException) {
        try {
            java.lang.reflect.Method m = handler.getClass().getMethod("someMethod", (Class<?>)null /* method parameters? */);
            m.invoke(handler,new Object[]{(ValidatorException)exc,req/*, res - maybe?*/});
        } catch(Exception e) {
            // Handle exception
        }
    }

    // Send email of the error etc..
}

Это не совсем элегантное решение, но должно работать ..

2 голосов
/ 23 февраля 2011

Как только вы поместите хотя бы один Exception Resolver в контекст приложения, DispatcherServlet прекращает создание экземпляров по умолчанию ( AnnotationMethodHandlerExceptionResolver в вашем случае).

Обязательно добавьте AnnotationMethodHandlerExceptionResolver и SimpleMappingExceptionResolver в контекст приложения, а также наложите их порядок.

См. мой пост для подробного объяснения.

0 голосов
/ 23 ноября 2010

Я не знаком со средой портлетов, но, возможно, вам также нужно объявить AnnotationMethodHandlerExceptionResolver.

...