7

使用 编写事务方法时@Async,无法捕获@Transactional异常。喜欢ObjectOptimisticLockingFailureException,因为它们在例如事务提交期间被抛出方法本身之外。

例子:

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(..);
    }
}

我知道我可以捕获一般如下的@Async异常:

@Component
public class MyHandler extends AsyncConfigurerSupport {
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return (ex, method, params) -> {
            //handle
        };
    }
}

但我更愿意以不同的方式处理给定的异常,只有当它发生在UpdateService.

问题:我怎样才能在里面抓住它UpdateService

是唯一的机会:创建一个附加@Service的包装UpdateService和有一个try-catch块?或者我可以做得更好吗?

4

1 回答 1

2

您可以尝试自我注入您的 bean,它应该与Spring 4.3一起使用。虽然自我注入通常不是一个好主意,但这可能是合法的用例之一。

@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
    }
}
于 2016-09-05T10:03:18.737 回答