'Quarkus No serializer found class io.smallrye.mutiny.operators.uni.builders.UniCreateFromPublisher no properties discovered to create BeanSerializer
I'm learning Quarkus Reactive with Mongo Panache and when i try to add a Metadata and Pagination object i get the error: "ERROR [io.qu.re.re.ja.ru.ma.NativeInvalidDefinitionExceptionMapper] (executor-thread-0) com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class io.smallrye.mutiny.operators.uni.builders.UniCreateFromPublisher and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.Entites.BrandResponse["data"])". Controller:
@Path("/brand/")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@RegisterForReflection
public class brand {
private static Logger LOG = LoggerFactory.getLogger(brand.class);
@Inject BrandRepository br;
@GET
public Response list(
@DefaultValue("0") @QueryParam("page") Integer page,
@DefaultValue("10") @QueryParam("page_size") Integer page_size) throws JsonProcessingException {
if (page != null && page >= 1) {
page--;
} else {
page = 0;
}
Uni<List<ReactivePanacheMongoEntityBase>> brands = br.listBrands(page,page_size);
return Response.ok((new BrandResponse(new Metadata("ok",200,"ok"),brands,new Pagination(3,page,page_size)))).build();
}
}
Repository
@ApplicationScoped
@RegisterForReflection
public class BrandRepository implements ReactivePanacheMongoRepositoryBase<Brands, Integer> {
public Uni<List<ReactivePanacheMongoEntityBase>> listBrands(Integer page, Integer page_size) {
return Brands.findAll(Sort.by("name").ascending()).page(Page.of(page, page_size)).list();
}
}
Entity
@Data
@RegisterForReflection
@MongoEntity(collection = "brand")
public class Brands extends ReactivePanacheMongoEntityBase {
@BsonId
public ObjectId id;
@JsonProperty("name")
@BsonProperty("name")
public String name;
}
Entity
@RegisterForReflection
@Data
public class BrandResponse {
@JsonProperty("metadata")
public Metadata metadata;
@JsonProperty("data")
public Uni<List<ReactivePanacheMongoEntityBase>> data;
@JsonProperty("pagination")
public Pagination pagination;
public BrandResponse(Metadata metadata, Uni<List<ReactivePanacheMongoEntityBase>> data, Pagination pagination) {
this.metadata = metadata;
this.data = data;
this.pagination = pagination;
}
}
Entity
@RegisterForReflection
@Data
public class Metadata {
@JsonProperty("status")
public String status;
@JsonProperty("http_code")
public Integer httpCode;
@JsonProperty("date_time")
public Date dateTime;
@JsonProperty("message")
public String message;
public Metadata(String status, Integer httpCode, String message) {
this.status = status;
this.httpCode = httpCode;
this.dateTime = new Date();
this.message = message;
}
}
Entity
@RegisterForReflection
@Data
public class Pagination{
@JsonProperty("total_count")
public Integer totalCount;
@JsonProperty("page")
public Integer page;
@JsonProperty("page_size")
public Integer pageSize;
public Pagination(Integer totalCount, Integer page, Integer pageSize) {
this.totalCount = totalCount;
this.page = page;
this.pageSize = pageSize;
}
}
Thank You For Your Help
Solution 1:[1]
When returning some asynchronous data, you can't have any of the fields being an asynchronous type (Uni
in this case).
So essentially you need to convert Uni<X>
to Uni<Y>
and return that.
In your case you would need to make field data
of BrandResponse
be List<ReactivePanacheMongoEntityBase>
instead of Uni<List<ReactivePanacheMongoEntityBase>>
.
Once that is done you can create a BrandResponse
using something like:
Uni<List<ReactivePanacheMongoEntityBase>> brands = br.listBrands(page,page_size);
Uni<BrandResponse> brandResponse = brands.onItem().transform(b -> new BrandResponse(new Metadata("ok",200,"ok"),b,new Pagination(3,page,page_size)))
Now that you have a Uni you should convert your list
JAX-RS Resource Method to either return the Uni<BrandResponse>
directly, or replace the return type of javax.ws.rs.core.Response
to org.jboss.resteasy.reactive.RestResponse
.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | geoand |