微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Micronaut ReactiveStreamsCrudRepository 中的 ID 始终为空

如何解决Micronaut ReactiveStreamsCrudRepository 中的 ID 始终为空

我正在尝试在 Micronaut 中实现一个反应式 (r2dbc) 存储库,但我在查询数据时遇到了一些问题。使用非反应性存储库时不会发生这些问题。 这是我的反应式存储库的外观:

@R2dbcRepository(dialect = Dialect.MysqL)
public interface ReactiveCampaignRepository extends ReactiveStreamsCrudRepository<Campaign,Integer> {

    @Override
    Flux<Campaign> findAll();

}

这是我的常规存储库的外观:

@Repository
public interface CampaignRepository extends CrudRepository<Campaign,Integer> {

}

当从 ReactiveCampaignRepository 调用 findAll 方法时,我能够查询所有实体,但是它们的 ID 均为空。 当我从 CampaignRepository 调用 findAll 时,所有实体都会被查询并正确填充 Id。

这是 id 字段在 Campaign 中的样子,这是一个远程依赖

@Entity
@Table(name = "campaign")
public class Campaign implements Serializable {

    private static final long serialVersionUID = 1L;

    private Integer id;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

这个实体是这样自省的:

@Introspected(classes = {Campaign.class})
public class EntitiesConfiguration {
}

我是 micronaut 和 r2dbc 的新手,所以我可能会遗漏一些明显的东西,但我无法弄清楚,我们将不胜感激。

谢谢

编辑:

@tmarouane 这只是一个简单的控制器,用于测试事情是否按预期工作。

    @Get(value = "/all")
    public Flux<CampaignDTO> allCampaigns() {
        return reactiveCampaignRepository.findAll().map(CampaignDTO::new);
    }

    @Get(value = "/all2")
    public List<CampaignDTO> allCampaigns2() {
        return StreamSupport.stream(campaignRepository.findAll().spliterator(),false).map(CampaignDTO::new).collect(Collectors.toList());
    }

和控制器

@Produces(MediaType.APPLICATION_JSON)
@Secured(SecurityRule.IS_AUTHENTICATED)
@Controller("/campaign")
public class CampaignController {

    private final CampaignRepository campaignRepository;
    private final ReactiveCampaignRepository reactiveCampaignRepository;

    public CampaignController(CampaignRepository campaignRepository,ReactiveCampaignRepository reactiveCampaignRepository
                              ) {
        this.campaignRepository = campaignRepository;
        this.reactiveCampaignRepository = reactiveCampaignRepository;
    }

CampaignDTO 只是一个简单的 DTO 类,其中只使用了 Campaign 字段的一个子集,并带有一个接受 Campaign 对象的简单构造函数

    public CampaignDTO(Campaign campaign) {
        this.id = campaign.getId();
}

除了 id 之外,还有 1 个不为空的属性,但它自己的属性为空,我一开始没有发现 - 客户,即使 customer_id 填充在使用反应式和非反应式存储库查询的对象中,它的外观如下在广告系列中

    @JoinColumn(name = "customer_id",referencedColumnName = "customer_id")
    @ManyToOne(optional = false)
    public Customer getCustomer() {
        return customer;
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。