Podczas pisania metod transakcyjnych za pomocą @Async
nie można wychwycić wyjątków od @Transactional
. Podobnie jak ObjectOptimisticLockingFailureException
, ponieważ są one wyrzucane poza samą metodę podczas np. Zatwierdzania transakcji.Jak wychwycić wyjątki transakcji w @Synchronizacja?
Przykład:
public class UpdateService {
@Autowired
private CrudRepository<MyEntity> dao;
//throws eg ObjectOptimisticLockingFailureException.class, cannot be caught
@Async
@Transactional
public void updateEntity {
MyEntity entity = dao.findOne(..);
entity.setField(..);
}
}
wiem, że mogę złapać @Async
wyjątki w ogólnym następująco:
@Component
public class MyHandler extends AsyncConfigurerSupport {
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (ex, method, params) -> {
//handle
};
}
}
Ale wolałbym obsługiwać dany wyjątek w inny sposób tylko wtedy, występuje w obrębie UpdateService
.
Pytanie: jak mogę to złapać wewnątrz the UpdateService
?
Jest jedyną szansą: utworzenie dodatkowego @Service
, który owija UpdateService
i ma blok try-catch
? Czy mógłbym zrobić lepiej?
Jeśli rzeczywiście jest to właściwy użytek do samodzielnego wstrzyknięcia, może to być wystarczające. Pytanie brzmi: czy to prawda? – membersound
@membersound: Moim zdaniem jest ono ważne. Możliwe jest też nadużywanie go w taki sposób, że skończysz z "klasą boga" z 1000 liniami. Ale obsługa wyjątków jest specyficzna dla tej klasy, dlaczego nie umieścić jej w klasie. Jeśli ktokolwiek uzna to za złą praktykę, może zostawić komentarz tutaj ... – user140547
To nie działa i kończy się niepowodzeniem z: 'Istnieje zależność cykliczna między 1 fasolą". wiosna-boot.1.4.0 ze sprężyną.4.2.3 – membersound