Search code examples
springspring-aop

Aspect Around Transactional service throw UnexpectedRollbackException


I Have Aspect around Methods in Transactional service. Unfortunately, when I catch errors by service, another exception is throwed. How can I prevent from this error ? *I searched for similar question but no-one solutions seems be adequat for my case

@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;
        }
    }
}

And error log.

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 

Solution

  • Ok I found solution. @Transactional is also @Arround Aspect. The problem was in ordering aspects. My Guard class wasn't in fact around Transaction. Put @Order(0) on Guard and @Order(1) on @Transactional service solved issue.