2016-09-05 23 views
5

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?

Odpowiedz

1

Możesz spróbować fasoli self-injecting, która powinna działać z Spring 4.3. Chociaż samodzielne wstrzykiwanie nie jest dobrym pomysłem, może to być jeden z przypadków użycia, które są uzasadnione.

@Autowired 
private UpdateService self; 

@Transactional 
public void updateEntity() { 
    MyEntity entity = dao.findOne(..); 
    entity.setField(..); 
} 

@Async 
public void updateEntityAsync(){ 
    try { 
     self.updateEntity(); 
    } catch (Exception e) { 
     // handle exception 
    } 
} 
+0

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

+0

@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

+0

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