Quarkus REST Jackson客户端POST请求发送空负载问题
Quarkus REST Client v3.13.2 POST请求体丢失问题
问题背景
从quarkus-resteasy迁移至quarkus-rest v3.13.2客户端后,发现REST客户端仅发送GET参数,完全忽略POST请求体。本地JVM(非原生)DEV模式测试时,日志显示请求体为空,但已确认传入的DTO字段均非空。
相关代码
客户端接口(Swagger生成,手动添加注解)
@Path("/api/v/2024-03-20") public interface ResourceClient { @POST @Path("resource") CreateResourceResponse createResource(CreateResource body); }
请求DTO(Swagger生成)
@ApiModel(description = "The `createResource` request.") @jakarta.annotation.Generated(value = "io.swagger.codegen.languages.JavaClientCodegen", date = "2024-06-12T12:45:38.427+02:00") @RegisterForReflection public class CreateResourceRequest { @JsonProperty("dataList") private List<String> dataList = new ArrayList<>(); @JsonProperty("items") private List<ItemInput> items = new ArrayList<>(); }
客户端初始化代码
@Provides public ResourceClient getClient(/.../) { return QuarkusRestClientBuilder.newBuilder() .baseUri(URI.create(uri)) .queryParamStyle(QueryParamStyle.COMMA_SEPARATED) .register(ExceptionMapper.class) .build(ResourceClient.class); }
依赖配置(pom.xml)
<!-- REST clients generation --> <dependency> <!-- * If your application uses a client and exposes REST endpoints, please use Quarkus REST for the server part. * Please note that the quarkus-resteasy-client extension may not be used with Quarkus REST, use quarkus-rest-client instead. --> <groupId>io.quarkus</groupId> <artifactId>quarkus-rest-client</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-rest-jackson</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-rest-client-jackson</artifactId> </dependency> <dependency> <!-- Generates rest API handler lambda (YES I USE REST SERVER AND CLIENT IN THE SAME SUB-MODULE --> <groupId>io.quarkus</groupId> <artifactId>quarkus-amazon-lambda-rest</artifactId> </dependency>
日志配置(application-dev.properties)
quarkus.rest-client.logging.scope=request-response quarkus.rest-client.logging.body-limit=1024 quarkus.log.category."org.jboss.resteasy.reactive.client.logging".level=DEBUG
问题现象
日志输出明确显示请求体为空,content-length=0:
(vert.x-eventloop-thread-0) Request: POST https://. .... content-length=0], Empty body
解决方法
- 添加请求体注解:Quarkus REST Client(基于Resteasy Reactive)要求显式标注请求体参数,在客户端接口的参数上添加
@Body注解:
@POST @Path("resource") CreateResourceResponse createResource(@Body CreateResource body);
旧版quarkus-resteasy-client可能隐式处理请求体,但Quarkus REST(Resteasy Reactive)必须通过@Body明确声明请求体参数。
校验DTO类型匹配:确认接口方法中的参数类型
CreateResource与实际传入的CreateResourceRequest为同一类型(或存在正确的映射关系),避免因类型不匹配导致序列化失败。验证依赖有效性:确保
quarkus-rest-client-jackson依赖正确引入,该依赖负责将Java对象序列化为JSON请求体,缺失会导致无法处理请求体序列化。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

