春天如何一起发送@Requestbody和@Requestpart

时间:2018-10-26 09:07:45

标签: spring spring-mvc spring-boot curl

我想使用curl在控制器中一起传递json和文件。我在控制器中有以下方法。

@PostMapping(value = /api/campaign, headers = {"content-type=multipart/mixed","content-type=multipart/form-data"})
    @ResponseBody
    @ResponseStatus(HttpStatus.CREATED)
    public @Valid ResponseDTO campaignCreator (@Valid @RequestBody CampaignCreatorDTO campaignCreatorDTO, @RequestPart("file") MultipartFile adGraphic){
}

下面是curl命令

curl -i -X POST -H "Content-Type: multipart/mixed" -d "campaignCreatorDTO={\"edipi\":123456789,\"firstName\":\"John\",\"lastName\":\"Smith\",\"email\":\"john.smith@gmail.com\"};type=application/json" -F "file=@newfile.png;type=image/png"  http://localhost:8080/api/campaign

controller方法没有被调用。 当我将json放在文件中并在curl命令中使用文件代替直接json时,它可以工作。 但我不想将文件用于json。

我尝试将@RequestPart用于json对象,但存在相同问题。

有什么办法可以在json中传递多部分文件,我是说CampaignCreatorDTO对象?

更新::现在,我可以为两种类型传递RequestPart,但是图像大小即将达到0个字节。尽管文件系统中存在iamge。

更新的代码:: 现在使用下面的代码,并将文件大小设置为0字节。

@PostMapping(value = /api/campaign, consumes = {"multipart/form-data","multipart/mixed"})
    @ResponseBody
    @ResponseStatus(HttpStatus.CREATED)
    public @Valid ResponseDTO campaignCreator (@Valid @RequestPart("json") CampaignCreatorDTO campaignCreatorDTO, @RequestPart("file") MultipartFile adGraphic) {
}

我尝试了此链接中给出的解决方案,但仍然是同一问题

Spring MVC Multipart Request with JSON

这是客户端将数据暂停到服务器的方式

let formData = new FormData()

const blob = new Blob([json], {
type: 'application/json'
});

formData.append("json", blob)
formData.append("file", values.adCreativeImageCover)

let authToken = sessionStorage.getItem("authToken")

fetch(/api/campaign, {
method: "POST",
headers: {
'Accept': 'application/json',
'X-Auth-Token': authToken,
},
mode: 'cors',
body: formData
})

2 个答案:

答案 0 :(得分:0)

我通过在配置中实现multipartresolver解决了这个问题。

@Bean
    public MultipartResolver multipartResolver() {
        return new StandardServletMultipartResolver();
    }

答案 1 :(得分:0)

第一种方式: 如果您将使用 postman/javaScript 框架 -> 您必须定义每个 RequestPart 的媒体类型。邮递员中的示例: enter image description here

第二种方式是实现octet-stream的维护,因为如果请求部分没有content-type头,spring默认在apiVersion: v1 kind: PersistentVolumeClaim metadata: labels: role: mongo name: pvc-nfs-pv1-mongod-0 namespace: default spec: ... volumeName: nfs-pv1 accessModes: - ReadWriteOnce resources: requests: storage: 500Mi ... 中设置它。 (我正在使用 AbstractMessageConverterMethodArgumentResolver.classY

所以这是我发现的 2 个案例(将响应 JSON 映射到 DTO):

1 个案例(不推荐): 设置对 JSON 转换器的支持: enter image description here

2 种情况: 定义新的 Converter 类,它肯定适用于所需的类(在我的情况下是 spring-boot-starter-parent 2.4.1 -> spring-webmvc 5.3.2),并且肯定会像 octet-stream 那样来实现它, override MDVersionDTO.class 方法。 enter image description here