我找不到一个好的解决方案:在我的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的pre-update方法中抛出的异常,直接的异常是持久性无法发生。
但是,从未尝试使用以下方法来使用我的自定义异常:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(TechRoleException.class)
public String techRoleException(HttpServletRequest request, Exception ex) {
System.out.println("Got here");
return "home";
}
}
这是一个类似的线程,其中答案是错误的,没有回答这个问题: @ExceptionHandler for Wrapped Exception / getCause() in Spring
答案 0 :(得分:1)
也许是这样吗?
@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
}
}
答案 1 :(得分:1)
我最后的工作答案是处理 General 异常,然后使用Apache ExceptionUtils.getRootCause()
来检测我正在此常规处理程序中寻找的特定原因
(如果其他特定的异常具有专用的Handler,则不会出现在此方法中。但是,如果没有专用的Handler,则将在此处出现异常。)这是检测某些目标Caused-By的唯一方法。
@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...
// ...
}