0

I have the following scenario: I have a ProductFamily that has a set of Products.

I load the ProduktFamily from the database and then I want to load its Products and insert them into ProduktFamily.products.

Easy in Spring MVC (because of JPA) but with Webflux I am struggeling. I tried this, but it does not work. ProduktFamily.products-set is empty.

Service:

public Flux<ProduktfamilyRS> getAllProduktFamilies() {
    return produktfamilyDatabaseFacade.findAll()
        .map(produktfamilyEntity2 -> dtoMapper.produktfamilyEntityToProduktfamilyRS(produktfamilyEntity2)) // <-- Mapsctruct Mapper
        .concatMap(produktfamilyRS -> loadProducts(produktfamilyRS));
  }


private Mono<ProduktfamilieRS> loadProducts(ProduktfamilieRS produktfamilieRS) {
    Flux<ProduktEntity> byProduktfamilieId = produktDatabaseFacade.findByProduktfamilieId(produktfamilieRS.getId());
    Flux<ProduktRS> produktRSFlux = byProduktfamilieId.map(produktEntity -> dtoMapper.produktEntityToProduktRS(produktEntity));

    return Mono.just(produktfamilieRS).map(produktfamilieRS1 -> {
      produktRSFlux.all(produktRS -> produktfamilieRS1.getProdukte().add(produktRS));
      produktRSFlux.subscribe();
      return produktfamilieRS1;
    });
  }

ProduktfamilyDatabaseFacade:

  public Flux<ProduktfamilyEntity> findAll() {
    return produktfamilyRepository.findAll();
  }

ProduktfamilyDatabaseFacade:

 public Flux<ProduktEntity> findByProduktfamilyId(Long produktfamilyId) {
    return produktRepository.findAllByProduktfamilyId(produktfamilyeId)
        .doOnNext(produktEntity -> log.info("Found Produkt '" + produktEntity.getName() + "' für Produktfamilie"));
  }

Is there an way to start from the Mono and then iterate through the Flux to add every Product to the Productfamily and then return the ProductfamilyRS?

Thank you

MarkusJackson
  • 225
  • 2
  • 12

1 Answers1

0

Ok got it working, but do not know if its a good way. Can somebody review?

  public Flux<ProduktfamilieRS> getAllProduktFamilien() {
    return produktfamilieDatabaseFacade.findAll()
        .map(produktfamilieEntity2 -> dtoMapper.produktfamilieEntityToProduktfamilieRS(produktfamilieEntity2))
        .concatMap(this::loadProdukteFlat);
  }


  private Mono<ProduktfamilieRS> loadProdukteFlat(ProduktfamilieRS produktfamilieRS) {
    return produktDatabaseFacade.findByProduktfamilieId(produktfamilieRS.getId())
        .doOnNext(produktEntity -> produktfamilieRS.getProdukte().add(dtoMapper.produktEntityToProduktRS(produktEntity)))
        .then(Mono.just(produktfamilieRS));
  }

MarkusJackson
  • 225
  • 2
  • 12
  • you can collect all the results to a list or map and then iterate the list and add it to the object and return – namila007 Aug 14 '21 at 15:24