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

Micronaut Repository返回Stream类型对象遇连接关闭问题求助

解决方案

问题根源

报错核心是事务未覆盖Stream的创建与消费全周期,常见触发场景:

  • 内部方法调用导致@Transactional未通过代理生效,事务未实际开启
  • Repository自定义查询方法未显式声明事务,Stream创建时无活跃数据库连接

具体修复步骤

1. 为Repository方法添加只读事务注解

在返回Stream的自定义方法上显式添加事务注解,确保Stream创建处于事务上下文内:

import io.micronaut.transaction.annotation.Transactional;

public interface ProductRepository<T extends ProductDataAccessObject> extends CrudRepository<T, UUID> {
    @Nonnull
    @Transactional(readOnly = true)
    Stream<T> findByPriceBetween(double min, double max);
}

2. 确保事务注解通过代理生效

如果test方法是被同一类内部方法直接调用,Micronaut的事务代理不会触发,导致事务未真正开启。解决方式:

  • 将test方法迁移至独立服务类
  • 通过依赖注入调用该服务类的test方法,而非内部直接调用

3. 验证依赖完整性

确保项目已引入必要的JPA与事务依赖(以Gradle为例):

implementation "io.micronaut.sql:micronaut-hibernate-jpa"
implementation "io.micronaut.transaction:micronaut-transaction-jdbc"

验证代码示例

修改后的独立服务类:

import jakarta.inject.Singleton;
import io.micronaut.transaction.annotation.Transactional;

@Singleton
public class ProductService {
    private final ProductRepository<ProductDataAccessObject> products;

    public ProductService(ProductRepository<ProductDataAccessObject> products) {
        this.products = products;
    }

    @Transactional
    public void test(double min, double max) throws Exception {
        try (var productStream = this.products.findByPriceBetween(min, max)) {
            // 后续可替换为forEach逻辑
            var list = productStream.map(ProductDataAccessObject::entity).toList();
        }
    }
}

内容的提问来源于stack exchange,提问作者codingdictionary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:35:20