首页 > 解决方案 > 在 SpringBoot 中发送 Json 和多部分文件

问题描述

我试图弄清楚如何将一组可选参数以及一个多部分文件传递给 SpringBoot 控制器,但不知道如何。

没有多部分文件,这很好用

public ResponseEntity<ViewModel> performOperationOnFilePath(@Valid @RequestBody final FileOperationFileContract requestBody) 

其中 FileOperationFileContract 是一个 POJO,看起来像这样

public class FileOperationFileContract {
    @NotBlank(message = "The filepath is required")
    private String filePath;

    private Map<String, String> options = new HashMap<>();

    @JsonAnyGetter
    public Map<String, String> getOptions() {
        return options;
    }

    @JsonAnySetter
    public void setOptions(final String name, final String value) {
        options.put(name, value);
    }
}

这是我对多部分文件的尝试

public ResponseEntity<ViewModel> performOperationOnFile(@RequestParam(name="myfile") final MultipartFile file, @RequestPart(name="options", required=false) final FileOperationMultipartFileContract requestBody)

其中 FileOperationMultipartFileContract 是一个 POJO,看起来像这样

public class FileOperationMultipartFileContract {
    private Map<String, String> options = new HashMap<>();

    @JsonAnyGetter
    public Map<String, String> getOptions() {
        return options;
    }

    @JsonAnySetter
    public void setOptions(final String name, final String value) {
        options.put(name, value);
    }
}

如果我像这样在 Postman 中指定 Json 有效负载,这似乎有效(请注意,我必须将内容类型指定为 application/json,否则我会收到消息“'application/octet-stream' not supported”

在此处输入图像描述

但是如果没有发送 json 部分,我会得到 403。我希望选项集合为空或 null。换句话说,我希望它默认为 {}

我试过 RequestPart 和 RequestParam,但没有区别。我也尝试过使用和不使用 @Valid 注释

我怎样才能做到这一点?

更新:我认为我发现我的问题与 Spring 的关系不如我试图对@JsonAnyGetterand@JsonAnySetter注释做的事情。如果我将 FileOperationFileContract 更改为具有常规字段,它就可以工作。但我的猜测是,我拥有它的方式不适用于 null。尽管如果值为 null,则不应调用setOptions. 有任何想法吗?

标签: jsonspring-bootjacksonmultipartform-datamultipart

解决方案


推荐阅读