You need to enable JavaScript to run this app. Quarkus-resteasy调用multipart/form-data找不到writer报错如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus-resteasy调用multipart/form-data找不到writer报错如何解决?

问题原因

你的报错核心是Quarkus运行时环境下,手动创建的ResteasyClient未自动注册multipart相关的序列化writer:

  • 普通main方法运行属于Java SE环境,Resteasy会通过SPI机制自动扫描classpath下的MultipartFormDataWriter实现,所以运行正常
  • Quarkus做了构建时类裁剪和SPI优化,手动通过new ResteasyClientBuilderImpl()创建的客户端不会自动加载该provider,因此抛出找不到writer的异常
解决方案

方案1:手动注册provider(适配你现有代码的最小改动)

构建ResteasyClient时显式注册MultipartFormDataWriter即可,同时删除多余的Content-Type属性配置,修改后的代码如下:

try{
    // 注册multipart序列化writer
    resteasyClient = new ResteasyClientBuilderImpl()
        .register(org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataWriter.class)
        .build();
    resteasyWebTarget = resteasyClient.target(httpURL);
    // 删掉这行多余配置,post方法指定的Entity的content type已经生效
    // resteasyWebTarget.property("Content-Type", MediaType.MULTIPART_FORM_DATA);
    multipartFormDataOutput = new MultipartFormDataOutput();
    multipartFormDataOutput.addFormData(
            "file",
            new FileInputStream(filePath),
            MediaType.MULTIPART_FORM_DATA_TYPE,
            "fileName");
    genericEntity = new GenericEntity<MultipartFormDataOutput>(multipartFormDataOutput, MultipartFormDataOutput.class);

    // invoke service
    response = resteasyWebTarget
                   .request()
                   .post(Entity.entity(genericEntity, MediaType.MULTIPART_FORM_DATA));

方案2:使用Quarkus推荐的声明式REST Client(长期更优)

符合Quarkus的开发规范,无需手动管理客户端和provider,Quarkus会自动完成所有注册逻辑:

  1. 定义表单POJO
public class FileUploadForm {
    @FormParam("file")
    @PartType(MediaType.APPLICATION_OCTET_STREAM)
    public InputStream file;
    @FormParam("fileName")
    @PartType(MediaType.TEXT_PLAIN)
    public String fileName;
}
  1. 定义REST客户端接口
@RegisterRestClient(baseUri = "你的REST服务根地址")
public interface FileUploadClient {
    @POST
    @Path("你的接口路径")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    Response uploadFile(@MultipartForm FileUploadForm form);
}
  1. 注入使用
@Inject
@RestClient
FileUploadClient uploadClient;

// 业务代码中直接调用
FileUploadForm form = new FileUploadForm();
form.file = new FileInputStream(filePath);
form.fileName = "fileName";
Response response = uploadClient.uploadFile(form);
依赖验证

你当前的项目依赖已经包含io.quarkus:quarkus-resteasy-multipart,无需额外新增依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 16:09:02