如何为R2dbcRepository统一注册错误处理器,消除重复异常处理代码?
如何给R2dbcRepository统一添加全局错误处理?
背景
我有一个应用级的通用异常处理器,用于转换R2dbcRepository抛出的异常,核心逻辑示例如下:
@Component public class ErrorHandler { public Throwable mapError(Throwable ex) { if (ex instanceof DataIntegrityViolationException || ex instanceof R2dbcDataIntegrityViolationException) { return new MyException(myParameters); } return new MyException(SERVER_ERROR, "Error accessing database", ex); } }
我还有一个包含大量自定义查询的R2dbcRepository,示例如下:
import org.springframework.data.r2dbc.repository.Query; import org.springframework.data.r2dbc.repository.R2dbcRepository; public interface MyEntityRepository extends R2dbcRepository<MyEntity, UUID> { @Query("SELECT * FROM my_entity WHERE <complex conditions>") Flux<MyEntity> findBySomeCriteria(MyConditions myConditions); ... // 其他大量方法 }
我希望每次调用仓库的任意方法后自动调用mapError()方法,目前的实现方式如下:
@Service public class MyService { @Autowired MyEntityRepository repository; @Autowired ErrorHandler errorHandler; public Mono<MyData> getMyData(MyCriteria criteria) { return Mono.just(criteria) ... // 处理输入数据 .flatMap(repository::findBySomeCriteria) .onErrorMap(errorHandler::mapError) // 这是重复的样板代码 ... // 额外业务逻辑 ; } }
问题说明
我希望移除上述重复的样板代码
.onErrorMap(errorHandler::mapError)
并将错误处理逻辑内置到仓库中。
问题
在R2dbcRepository中是否有优雅的解决方案,可以统一注册我的错误处理器,让每个仓库方法的调用都自动被该处理器装饰?
内容的提问来源于stack exchange,提问作者Honza Zidek
相关产品推荐
相关产品推荐

