簡體   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