Search code examples
javareactive-programmingmicronautmicronaut-data

Id always null in Micronaut ReactiveStreamsCrudRepository


I'm trying to implement a reactive(r2dbc) repository in Micronaut but I'm having some problems with the data that is being queried. Those issues don't occur when using non-reactive repositories. Here's how my reactive repository looks:

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

    @Override
    Flux<Campaign> findAll();

}

And this is how my regular repository looks:

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

}

When invoking findAll method from ReactiveCampaignRepository I'm able to query all entities, however all of them have null ids. When I invoke findAll from CampaignRepository all entites are queried and Ids are populated correctly.

This is how id field looks in Campaign, which is a remote dependency

@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;
    }

This entity is introspected like this:

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

I'm new to micronaut and r2dbc so I could be missing something obvious but I cannot figure it out and any pointers would be greatly appreciated.

Thank You

EDIT:

@tmarouane It's just a simple controller to test if things are working as they should.

    @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());
    }

and controller

@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 is just a simple DTO class where just a subset of Campaign's fields are used, with a simple constructor taking Campaign object.

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

Besides id there's 1 more attribute which is not null but it's own attributes are null which I haven't spotted at first - customer, even though customer_id is populated in objects queried with both reactive and non reactive repos, here's how it looks in Campaign

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

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

Solution

  • This seems to be solved in micronaut 3.0.1 but it doesn't work in 3.0.2