Spring Data JDBC为何二次包装自定义仓库返回的Vavr Try?
Spring Data自定义仓库返回Try被二次包装为Try<Try>的问题
问题场景
使用Spring Boot 3.4.3,希望通过返回VAVR的Try类型处理错误(而非抛出异常),且Spring事务已支持Try类型——当返回Failure时会自动回滚事务。但自定义仓库方法出现异常行为:方法声明返回Try<String>,实际调用后却得到Try<Try<String>>,即结果被Spring额外包装了一层Try。
相关代码示例
public interface OrderRepository extends ListCrudRepository<Order, Integer>, CustomOrderRepository {} public interface CustomOrderRepository { Try<String> tryUpdateStatus(Integer orderId, String newStatus); String updateStatus(Integer orderId, String newStatus); }
排查发现
查看org.springframework.data.repository.util.QueryExecutionConverters源码后发现:当检测到VAVR依赖时,Spring会为Try类型添加执行适配器,这个适配器会修改自定义仓库方法的返回类型处理逻辑,导致二次包装。
测试验证
- 返回
String的updateStatus方法工作正常; - 自定义仓库的
tryUpdateStatus方法返回异常:实际得到Success(OUT_OF_STOCK)(即原本的Try<String>被再次包装进Success),不符合预期; - 直接在基础仓库(如
ListCrudRepository的子接口)中添加的tryUpdateStatus2方法可正常工作,仅自定义仓库的方法出现二次包装问题。
已创建问题复现仓库,并向Spring Data Commons提交了Bug报告。
内容的提问来源于stack exchange,提问作者Luis Muñiz
相关产品推荐
相关产品推荐

