Aspect Around serwisu transakcyjnego wywoluje UnexpectedRollbackException

0

Mam problem.
Posiadam Aspect Around ktory wywoluje metode Serwisu.
Gdy service zwroci exception, zostanie on prawidlowo obsluzony przez aspect, ale zaraz po nim pojawia sie UnexpectedRollbackException. Nie umiem sobie z nim poradzic

@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 
0

Źle czynisz... Ale możesz wymusić order tych aspektów, tak żeby ten twój był dookoła tej transakcji a nie odwrotnie, nic więcej chyba się tu zrobić nie da. Alternatywą jest zrobienie ręcznie tych transakcji. Spróbuj z tym @Order(1) przy aspekcie jeśli koniecznie musisz to tak robić.

0
Shalom napisał(a):

Źle czynisz... Ale możesz wymusić order tych aspektów, tak żeby ten twój był dookoła tej transakcji a nie odwrotnie, nic więcej chyba się tu zrobić nie da. Alternatywą jest zrobienie ręcznie tych transakcji. Spróbuj z tym @Order(1) przy aspekcie jeśli koniecznie musisz to tak robić.

Ale on jest w zasadzie do okola tej transakcji. Poniewaz ContraintViolation prawidlowo sie wyswietla, jest to oczekiwane. Jezeli transakcja sie nie powiedzie - czyli bedzie blad to serviceLayer ma zwrocic null.
Dlaczego nie dziala to tra Servisu transaction, a dziala jezeli around przeniose o poziom wyzej czyli do Fasady ?

1

Bo @Transactional to jest aspekt Around i zazębia sie z twoim.

0
Shalom napisał(a):

Bo @Transactional to jest aspekt Around i zazębia sie z twoim.

No i wszystko jasne. Czyli jedyna opcja jest puszczenie tego przez fasade, co w sumie troche komplikuje mi sprawe, ze wzgledu na to jak chcialam to obsluzyc. Dzieki wielkie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1