2014-09-14 6 views
2

Im 'работает над пружинным приложением в последнее время, используя спящий режим, тимелеар и пружинную защиту.Обработка исключений Spring: обработчик @exception не вызывается

я наткнулся на ситуацию: я сделал специальное исключение:

@ResponseStatus(HttpStatus.BAD_REQUEST) 
public class GlobalUrlParametersErrorsException extends RuntimeException { 

    private String errorMsgSignature; 

    private String errorMsgContent; 

    private String redirectionUrl; 

    public String getErrorMsgSignature() { 
     return errorMsgSignature; 
    } 

    public void setErrorMsgSignature(String errorMsgSignature) { 
     this.errorMsgSignature = errorMsgSignature; 
    } 

    public String getErrorMsgContent() { 
     return errorMsgContent; 
    } 

    public void setErrorMsgContent(String errorMsgContent) { 
     this.errorMsgContent = errorMsgContent; 
    } 

    public String getRedirectionUrl() { 
     return redirectionUrl; 
    } 

    public void setRedirectionUrl(String redirectionUrl) { 
     this.redirectionUrl = redirectionUrl; 
    } 

    public GlobalUrlParametersErrorsException(String errorMsgSignature, String errorMsgContent, String redirectionUrl){ 

     this.errorMsgSignature = errorMsgSignature; 
     this.errorMsgContent = errorMsgContent; 
     this.redirectionUrl = redirectionUrl; 
    } 

} 

Это исключение продолженную некоторыми другими пользовательскими исключениями я написал.

Для обработки этих исключений я добавил @ControllerAdvice:

@ControllerAdvice 
public class GlobalDefaultExceptionHandler { 
//some other exception like hibernate exception ... 

    @ExceptionHandler(value = GlobalUrlParametersErrorsException.class)//{InvalidDateException.class, InvalidRole.class, NoSuchUser.class, NoSuchNotification.class,NoSuchConsultation.class,NoSuchRdv.class}) 
    public ModelAndView whenUrlDateParametersSuckMethod(RedirectAttributes redirectAttributes,GlobalUrlParametersErrorsException e){ 

     redirectAttributes.addFlashAttribute(e.getErrorMsgSignature(),e.getErrorMsgContent()); 
     return new ModelAndView("redirect:"+e.getRedirectionUrl()); 
    } 

    @ExceptionHandler(value = Exception.class) 
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception { 
     ModelAndView m = new ModelAndView("errors/defaultError"); 
     m.addObject("exception", e.toString()); 
     m.addObject("url", req.getRequestURL()); 
     return m; 
    } 

} 

Но весь мои исключения, что я бросаю в контроллере не поймали (я получаю GlassFish страницы ошибки)

Так что же случился с с моим согласен?

PS: Когда я удалить обработчик исключений из моего пользовательского исключения, и пусть только другую, она работает

+0

имеют вид [здесь] (http://ankursinghal86.blogspot.in/2014/07/exception-handling-in-spring-mvc .html) –

+0

Эта статья взята из [здесь] (http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc), и все же я читаю, я до сих пор не получаю почему мой не работает – Aissasa

+0

Не уверенный в этом, но я никогда не видел весной документацию, что было приоритетом, когда более одного '@ ExceptionHandler' * в том же классе * соответствует Исключению. Это будет связано с тем, что если у вас есть только один обработчик исключений, он работает. У вас нет сообщений в журналах? –

ответ

0

Попробуйте добавить эту строку в конфигурации пружинной:

<mvc:annotation-driven/> 

Если вы не ставьте его, ваш класс не будет загружен.

+0

Прошло некоторое время с тех пор, как я работал над этим проектом, но я использовал java config, а не xml, и я думаю, что добавил его эквивалент в java config :) – Aissasa

0

Очевидно, вы не можете использовать RedirectAttributes в аргументах метода @ExceptionHandler: обработчик игнорируется. В настоящее время the docs говорит:

Многое, как стандартные методы контроллера аннотированных с @RequestMapping аннотацией, аргументами метода и возвращаемые значения методов @ExceptionHandler могут быть гибкими. Например, доступ к HttpServletRequest можно получить в средах Servlet и в среде PortletRequest в среде Portlet.

Похоже, что вы можете использовать одни и те же параметры метода @RequestMapping, но он не работает с RedirectAttributes.

Обойти это направить на @RequestMapping:

@ExceptionHandler(MyException.class) 
public String handleMyException(MyException e) { 
    return "forward:/internalError"; 
} 

@RequestMapping("/internalError") 
public String internalError(RedirectAttributes redirectAttributes) { 
    // do stuff with redirectAttributes... 
    return "redirect:/someplace"; 
} 
Смежные вопросы