繁体   English   中英

spring中如何将@Requestbody和@Requestpart一起发送

[英]How to send @Requestbody and @Requestpart together in spring

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

@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

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

我试图对 json 对象使用 @RequestPart 但同样的问题。

有什么方法可以在 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) {
}

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

带有 JSON 的 Spring MVC 多部分请求

这就是客户端将数据发送到服务器的方式

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
})

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

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

第一种方式:如果您将使用 postman/javaScript 框架 -> 您必须定义每个 RequestPart 的媒体类型。 邮递员中的示例: 在此处输入图片说明

第二种方式是实现octet-stream的维护,因为如果请求部分没有content-type头,spring会在AbstractMessageConverterMethodArgumentResolver.class默认设置它。 (我正在使用spring-boot-starter-parent 2.4.1 -> spring-webmvc 5.3.2 是

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

1 种情况(不推荐):设置支持 JSON 转换器: 在此处输入图片说明

2 案例:定义新的 Converter 类,它肯定适用于所需的类(在我的情况下是MDVersionDTO.class ),并且绝对当它像octet-stream 一样出现时,要实现它, canRead()方法。 在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM