You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Quarkus RESTful API资源服务中传入InputStream类型参数?

解决方案:Quarkus REST接口直接接收InputStream参数

当你直接将REST方法参数设为InputStream时,JAX-RS默认会将其关联到二进制数据(如文件上传)的处理逻辑,这就是Swagger UI显示文件上传选项且接口无法正常工作的原因。要解决这个问题,你可以使用Quarkus提供的@Raw注解,让框架直接将请求体以原始流的形式传递,同时保留你指定的application/json和application/xml媒体类型。

修改后的代码示例

import io.quarkus.resteasy.reactive.Raw;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.HeaderParam;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import java.io.InputStream;
import java.util.List;

@Path("/api")
public class ConverterResource {

    @POST
    @Path("/converter")
    @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
    @Produces(MediaType.APPLICATION_JSON)
    public List<String> fileConverter(@HeaderParam("Content-Type") final String contentType, 
                                      @Raw final InputStream inputDocumentStream) {
        final TestClass testClass = new TestClass();
        return contentType.equals("application/xml") 
            ? testClass.xmlConverter(inputDocumentStream) 
            : eventHashGenerator.jsonConverter(inputDocumentStream);
    }
}

关键说明

  • @Raw注解:该注解来自io.quarkus.resteasy.reactive包,它告诉Quarkus不对请求体进行任何自动解析(比如不尝试将JSON/XML绑定到Java对象),直接将原始请求体作为InputStream传递给方法参数。
  • 媒体类型兼容:保留@Consumes中的application/json和application/xml,Swagger UI会识别为文本输入(而非文件上传),客户端可以正常发送JSON/XML格式的请求体。
  • 流的管理:无需手动关闭InputStream,Quarkus会在请求处理完成后自动负责资源释放。
  • 编码注意:InputStream是字节流,后续在xmlConverter或jsonConverter中转换为字符时,要使用请求体对应的编码(通常是UTF-8,可从Content-Type头的charset参数获取)。

内容的提问来源于stack exchange,提问作者BATMAN_2008

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 08:18:24