Spring ExceptionHandler для исключения "вызвано / перенесено" - PullRequest
0 голосов
/ 17 апреля 2019

Я не смог найти хорошего решения: в моем приложении Spring Boot, как метод @ExceptionHandler, мне нужно определить обработчик не для конкретного исключения, а для любого исключения , вызванного конкретное исключение (т. Е. Обернутое исключение).

Пример: Иногда я получаю это:

org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:541) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:746) ~[spring-tx-5.1.4.RELEASE.jar:5.1.4.RELEASE]    
    ... 121 common frames omitted
Caused by: custom.TechRoleException: My custom TechRoleException
    at myapp.method1[..]
    at myapp.methodOuter[..]

Мой пользовательский TechRoleException - это исключение, которое я выбрасываю в некоторый HibernateМетод предварительного обновления EventListener, и прямое исключение состоит в том, что постоянство не может возникнуть.

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

@ControllerAdvice
public class GlobalExceptionHandler {

  @ExceptionHandler(TechRoleException.class)
  public String techRoleException(HttpServletRequest request, Exception ex) {
    System.out.println("Got here");
    return "home";
  }
}

Вотпохожая тема, где ответ неправильный и не отвечает на этот вопрос: @ ExceptionHandler для Wrapped Exception / getCause () в Spring

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Мой окончательный рабочий ответ - обработать исключение General , а затем использовать Apache ExceptionUtils.getRootCause(), чтобы определить конкретную причину, которую я ищу в этом общем обработчике.

(Другие специфические исключения не будут применяться к этому методу, если у них есть свои выделенные обработчики. Но если нет выделенного обработчика, исключение придет сюда.) Это единственный способ обнаружить некоторую цель, вызванную.

@ExceptionHandler(Exception.class)
public String handleGeneralException(HttpServletRequest request, Exception ex) {

    Throwable rootCause = ExceptionUtils.getRootCause(ex);
    if (rootCause != null && "com.myapp.TechRoleException".equals(rootCause.getClass().getName())
    {       
        //... handle this Caused-By Exception here
        // ...
    }
    // All other exceptions that don't have dedicated handlers can also be handled below...
    // ...

}
1 голос
/ 18 апреля 2019

Может быть, что-то подобное?

@ExceptionHandler(Exception.class)
public String techRoleException(HttpServletRequest request, Exception ex) {
if(ex instanceof TechRoleException) {
    System.out.println("Got here");
    return "home";
} else {
    throw ex; //or something else
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...