You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:14:52