如何在Quarkus中以POJO对象传递GET查询参数?
解决Quarkus中用Record/POJO接收GET查询参数的问题
正确实现方案
要在Quarkus(基于Resteasy Reactive)中用对象接收GET查询参数,需要结合@BeanParam和@QueryParam(或Quarkus简化的@RestQuery),具体实现如下:
1. 资源类代码
在方法参数上保留@BeanParam注解,告知Quarkus从请求查询参数中解析该对象:
@Path("/example") public class ExampleResource { @GET public List<String> search(@BeanParam ExampleSearchParams params) { Log.info(params); return List.of(); } }
2. Record类代码
为record的每个构造参数添加@QueryParam(或@RestQuery)注解,明确对应URL中的查询参数:
import jakarta.ws.rs.QueryParam; public record ExampleSearchParams( @QueryParam("searchQuery") String searchQuery, @QueryParam("size") Integer size, @QueryParam("from") Integer from ) { }
如果使用Quarkus提供的@RestQuery简化注解,代码可改为:
import io.quarkus.resteasy.reactive.RestQuery; public record ExampleSearchParams( @RestQuery String searchQuery, @RestQuery Integer size, @RestQuery Integer from ) { }
注:当查询参数名与record字段名完全一致时,
@RestQuery和@QueryParam可省略参数名,框架会自动匹配。
之前尝试失败的原因
- 无注解直接传对象:Quarkus默认会把无注解的方法参数当作请求体解析,但GET请求没有请求体,因此返回415(不支持的媒体类型)错误。
- 仅加
@BeanParam未标记字段:@BeanParam需要明确每个字段的参数来源,否则CDI容器会尝试注入字段的依赖,导致“Unsatisfied dependency”启动错误。 - 仅在record加
@RestQuery:缺少@BeanParam标记方法参数,CDI依然会尝试注入record实例,而非从查询参数解析。 - 直接在方法参数加
@RestQuery:@RestQuery仅用于单个查询参数,无法直接解析为复杂对象,因此报错“无法创建转换器”。
内容的提问来源于stack exchange,提问作者Politechniczny
相关产品推荐
相关产品推荐

