使用multipart / form-data或multipart / mixed获取JSON和文件时获取Spring进行映射

时间:2019-01-31 23:13:46

标签: java spring spring-boot spring-mvc

我有一个可行的解决方案,但这似乎很愚蠢。

这是我的工作解决方案:

@PreAuthorize("isAuthenticated()")
@ApiOperation(value = "Takes in a document.", nickname = "Document Upload", response = DocumentResponse[].class)
@ResponseStatus(HttpStatus.ACCEPTED)
@RequestMapping(
        value = "/api/v1/document/upload",
        produces = "application/json",
        consumes = "multipart/form-data",
        method = RequestMethod.POST)
public DocumentResponse uploadDocument(
        // THIS is where I am using a String and don't want to.
        @RequestPart("fileData") String fileData, 
        @RequestPart("file") MultipartFile file,
        @RequestHeader("idempotency-id") String idempotencyId) throws IOException {

    // THIS is the line I would also like to avoid.
    DocumentUploadFileData fileDataObj = objectMapper.readValue(fileData, DocumentUploadFileData.class);

    printBeanValues(fileDataObj);

    More after....

问题在于fileDataString对象。我希望将JSON直接映射到我的DocumentUploadFileData类,而不必自己做,如此处所示:DocumentUploadFileData fileDataObj = objectMapper.readValue(fileData, DocumentUploadFileData.class);

我尝试过的:

  1. 我没有使用@RequestPart而不是。我实际上认为那会很好。不是。
  2. 列出项目@RequestBody。我以为肯定可以。相反,它只是开始对我大吼大叫我我的内容/类型无效?内容类型没有改变,但是由于某种原因,它希望它是application / json(即使我明确地说是multipart / form-data。我猜@ReqestBody是针对application / json请求的,它并没有不喜欢多人演奏吗?
  3. 我还尝试使用RequestParam,如果我使用String作为对象,该方法实际上可以工作。如果我尝试使用DocumentUploadFileData代替它失败,并告诉我它没有该对象的映射策略?我认为这是一个多部分请求的事实,使Spring决定使用可能需要添加的不同映射器?我知道多部分请求使用边界,并且通常只是有些不同,因此可以使用不同的解决方案是有意义的。我只是不知道该怎么提供。

我已经有3年没有使用Spring了,我确定解决方案不是那么复杂,但是,几个小时后我仍然没有得到它。

1 个答案:

答案 0 :(得分:1)

尝试采用此处指出的以下解决方案:Spring MVC Multipart Request with JSON

@RequestMapping(value = "/executesampleservice", method = RequestMethod.POST,
        consumes = {"multipart/form-data"})
    @ResponseBody
    public boolean executeSampleService(
            @RequestPart("properties") @Valid ConnectionProperties properties,
            @RequestPart("file") @Valid @NotNull @NotBlank MultipartFile file) {
        return projectService.executeSampleService(properties, file);
    }