Skip to content

Instantly share code, notes, and snippets.

@serrodcal
Created March 17, 2024 16:00
Show Gist options
  • Save serrodcal/bf70923208d0b589364850d95d27337a to your computer and use it in GitHub Desktop.
Save serrodcal/bf70923208d0b589364850d95d27337a to your computer and use it in GitHub Desktop.
@Entity
@Cacheable
public class OrderEntity extends PanacheEntityBase {
@Id
@SequenceGenerator(allocationSize = 1,name = "orderEntitySequence", schema = "public", sequenceName = "order_entity_seq")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "orderEntitySequence")
@Column(name = "id", nullable = false)
public Long id;
public UUID uuid;
public OrderStatus status;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public List<OrderItemEntity> orderItemEntities;
public BigDecimal price;
@CreationTimestamp public LocalDateTime createdAt;
@UpdateTimestamp public LocalDateTime updatedAt;
}
@Entity
@Cacheable
public class OrderItemEntity extends PanacheEntityBase {
@Id
@SequenceGenerator(allocationSize = 1,name = "orderItemEntitySequence", schema = "public", sequenceName = "order_item_entity_seq")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "orderItemEntitySequence")
@Column(name = "id", nullable = false)
public Long id;
public UUID productId;
public BigDecimal price;
@CreationTimestamp public LocalDateTime createdAt;
@UpdateTimestamp public LocalDateTime updatedAt;
}
public record OrderItemResponse(UUID uuid, BigDecimal price) {}
@Singleton
public class OrderRepository implements PanacheRepository<OrderEntity> {}
@Singleton
@RouteBase(path = "/v1", consumes = "application/json", produces = "application/json")
public class OrderResource {
private static final Logger log = Logger.getLogger(OrderResource.class.getName());
@Inject
OrderRepository orderRepository;
@Route(path = "/orders", methods = HttpMethod.GET)
@Timeout(250)
@WithSession
public Uni<PaginatedResponse<List<OrderResponse>>> orders() { // @Param Integer page, @Param Integer size, @Param Long start, @Param Long end
log.trace("OrderResource.orders()");
Uni<Long> countUni = orderRepository.count();
Uni<List<OrderResponse>> entitiesUni = orderRepository.listAll().onItem().ifNotNull().transform(i -> {
List<OrderResponse> res = new ArrayList<>();
for (OrderEntity e : i) {
int status = 0;
if (e.status == OrderStatus.COMPLETED)
status = 1;
List<OrderItemResponse> resItems = e.orderItemEntities.stream().map(item -> new OrderItemResponse(item.productId, item.price)).toList();
res.add(new OrderResponse(e.id, e.uuid, status, resItems, e.price, e.createdAt, e.updatedAt));
}
return res;
});
return Uni.combine().all().unis(countUni, entitiesUni).asTuple().onItem().ifNotNull().transform(i -> {
return new PaginatedResponse<List<OrderResponse>>(i.getItem1(), i.getItem2());
});
}
}
public record OrderResponse(
Long id,
UUID uuid,
int status,
List<OrderItemResponse> items,
BigDecimal price,
LocalDateTime createdAt,
LocalDateTime updatedAt
) {}
2024-03-17 16:59:48,752 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (vert.x-eventloop-thread-3) HTTP Request to /v1/orders failed, error id: 713b0773-37bd-467e-804e-15d540814844-1: java.lang.IllegalStateException: Illegal pop() with non-matching JdbcValuesSourceProcessingState
at org.hibernate.sql.results.spi.LoadContexts.deregister(LoadContexts.java:45)
at org.hibernate.reactive.sql.results.spi.ReactiveListResultsConsumer.finishUp(ReactiveListResultsConsumer.java:188)
at org.hibernate.reactive.sql.results.spi.ReactiveListResultsConsumer.lambda$consume$3(ReactiveListResultsConsumer.java:120)
at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:646)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2179)
at org.hibernate.reactive.util.async.impl.AsyncTrampoline$TrampolineInternal.unroll(AsyncTrampoline.java:131)
at org.hibernate.reactive.util.async.impl.AsyncTrampoline$TrampolineInternal.lambda$unroll$0(AsyncTrampoline.java:126)
at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2179)
at io.vertx.core.Future.lambda$toCompletionStage$3(Future.java:581)
at io.vertx.core.impl.future.FutureImpl$4.onSuccess(FutureImpl.java:176)
at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:66)
at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:246)
at io.vertx.sqlclient.impl.QueryResultBuilder.tryComplete(QueryResultBuilder.java:88)
at io.vertx.sqlclient.impl.QueryResultBuilder.tryComplete(QueryResultBuilder.java:32)
at io.vertx.core.Promise.complete(Promise.java:66)
at io.vertx.core.Promise.handle(Promise.java:51)
at io.vertx.core.Promise.handle(Promise.java:29)
at io.vertx.core.impl.future.FutureImpl$4.onSuccess(FutureImpl.java:176)
at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:66)
at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:246)
at io.vertx.core.impl.future.Transformation$1.onSuccess(Transformation.java:63)
at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:66)
at io.vertx.core.impl.future.FutureImpl.addListener(FutureImpl.java:231)
at io.vertx.core.impl.future.Transformation.onSuccess(Transformation.java:44)
at io.vertx.core.impl.future.FutureBase.lambda$emitSuccess$0(FutureBase.java:60)
at io.vertx.core.impl.ContextImpl.execute(ContextImpl.java:305)
at io.vertx.core.impl.DuplicatedContext.execute(DuplicatedContext.java:181)
at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:57)
at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:246)
at io.vertx.core.impl.future.PromiseImpl.onSuccess(PromiseImpl.java:49)
at io.vertx.core.impl.future.PromiseImpl.handle(PromiseImpl.java:41)
at io.vertx.core.impl.future.PromiseImpl.handle(PromiseImpl.java:23)
at io.vertx.sqlclient.impl.command.CommandResponse.fire(CommandResponse.java:46)
at io.vertx.sqlclient.impl.SocketConnectionBase.handleMessage(SocketConnectionBase.java:324)
at io.vertx.pgclient.impl.PgSocketConnection.handleMessage(PgSocketConnection.java:114)
at io.vertx.sqlclient.impl.SocketConnectionBase.lambda$init$0(SocketConnectionBase.java:137)
at io.vertx.core.impl.ContextImpl.emit(ContextImpl.java:335)
at io.vertx.core.impl.ContextImpl.emit(ContextImpl.java:328)
at io.vertx.core.net.impl.NetSocketImpl.handleMessage(NetSocketImpl.java:388)
at io.vertx.core.net.impl.ConnectionBase.read(ConnectionBase.java:159)
at io.vertx.core.net.impl.VertxHandler.channelRead(VertxHandler.java:153)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
at io.vertx.pgclient.impl.codec.PgDecoder.fireCommandResponse(PgDecoder.java:52)
at io.vertx.pgclient.impl.codec.PgCommandCodec.handleReadyForQuery(PgCommandCodec.java:137)
at io.vertx.pgclient.impl.codec.PgDecoder.decodeReadyForQuery(PgDecoder.java:248)
at io.vertx.pgclient.impl.codec.PgDecoder.channelRead(PgDecoder.java:107)
at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:1583)
public record PaginatedResponse<T> (
Long count,
T payload
) {}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment