如何配置Micronaut声明式客户端接收PATCH请求的空响应?
出现该错误的核心原因是Micronaut声明式HTTP客户端默认配置下,仅会跳过204(无内容)状态码的响应体解析逻辑,对于返回200状态码但响应体为空的场景,依然会尝试触发解码器解析空内容,由此抛出异常。可通过以下几种方案解决:
方案1:调整客户端方法返回类型
将对应@Patch注解标注的客户端方法返回值设置为void或者HttpResponse<Void>,框架识别到没有需要解析的业务返回类型,就会跳过响应体解码步骤。
import io.micronaut.http.annotation.Body; import io.micronaut.http.annotation.Patch; import io.micronaut.http.client.annotation.Client; import io.micronaut.http.HttpResponse; @Client("your-target-service") public interface ResourceClient { // 不需要获取响应元信息直接返回void @Patch("/resource/{id}") void updateResource(Long id, @Body ResourceUpdateDTO updateDTO); // 需要获取状态码、响应头等信息时返回HttpResponse<Void> @Patch("/resource/{id}") HttpResponse<Void> updateResourceWithMeta(Long id, @Body ResourceUpdateDTO updateDTO); }
方案2:方法级别关闭空响应报错
如果业务逻辑允许该接口既可能返回空响应,也可能返回对应业务实体,可以在方法上添加@ErrorOnEmptyResponse(false)注解,强制框架接受空响应,解码为空值而不是抛出异常。
import io.micronaut.http.annotation.Body; import io.micronaut.http.annotation.Patch; import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.annotation.ErrorOnEmptyResponse; @Client("your-target-service") public interface ResourceClient { @Patch("/resource/{id}") @ErrorOnEmptyResponse(false) ResourceDTO updateResource(Long id, @Body ResourceUpdateDTO updateDTO); }
该配置下如果服务端返回空响应,方法会直接返回null,不会触发解码错误。
方案3:全局配置关闭空响应报错
如果需要对所有HTTP客户端接口生效,可以在配置文件application.yml中添加如下配置:
micronaut: http: client: error-on-empty-response: false
内容的提问来源于stack exchange,提问作者shmish111
相关产品推荐
相关产品推荐

