围绕事务服务的方面抛出UnexpectedRollbackException

时间:2019-07-29 01:03:26

标签: spring-aop

我对事务服务中的方法有所了解。 不幸的是,当我通过服务发现错误时,会引发另一个异常。如何防止出现此错误? *我搜索了类似的问题,但没有一个解决方案适合我的情况

@Aspect
@Component
public class ServiceGuard {   
    @Pointcut("execution(* simgenealogy.service.*.*(..))")
    public void persistence() {}

    @Around("persistence()")
    public Object logPersistence(ProceedingJoinPoint joinPoint) { 
        try {
            Object o =  joinPoint.proceed();
            return o;
        } catch (ConstraintViolationException constraintException) {
            // (...)
            return null;
        } catch (Throwable throwable) {
            // (...)
            return null;
        }
    }
}

和错误日志。

2019-07-29 02:10:37.979 ERROR 11300 --- [ion Thread] s.a.g.s.w.ServiceGuard                   :
            Constraint violation: First Name cannot be empty
2019-07-29 02:10:38.023 ERROR 11300 --- [ion Thread] s.a.g.s.w.ServiceGuard                   :
            Constraint violation: Last Name cannot by empty
Exception in thread "JavaFX Application Thread" org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:755)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:714)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:534)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:305)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
    at 

2 个答案:

答案 0 :(得分:0)

您捕获了可能由于某种原因而发生的异常。然后,您可能只是在先前的(通过proceed())方法执行的结果中返回了null,可能是在预期另一个非null返回值的情况下。

由于您没有提供任何应用程序代码,所以这是推测性的,但是我假设会将null返回值分配给应该具有非null值的data属性(请参阅日志中的约束违例)。更准确地说,您将名字和姓氏设置为null会导致违反约束,这又会导致您的事务回滚,因为未设置强制数据字段。

如何解决此问题?返回姓氏/名字的非空默认值(听起来很奇怪),或者让原始异常升级而不是吞下它们并引起后续问题。

最重要的是:您的异常处理已中断,需要修复。

答案 1 :(得分:0)

好的,我找到了解决方案。  @Transactional也是@Arround Aspect。问题在于订购方面。我的Guard课实际上与Transaction无关。将@Order(0)放在Guard上,将@Order(1)放在@Transactional服务上解决了问题。