Spring MVC 内容类型'multipart/form-data;边界=----...;字符集=UTF-8“不受支持

gdrx4gfi  于 2022-11-14  发布在  Spring
关注(0)|答案(9)|浏览(501)

我想发送一个对象到控制器,它有几个文件列表和几个纯文本字段。

public class ContributionNew<T extends MovieInfoDTO> {
    private List<T> elementsToAdd;
    private Map<Long, T> elementsToUpdate;
    private Set<Long> idsToDelete;
    private Set<String> sources;
    private String comment;
}

public class Photo extends MovieInfoDTO {
    private MultipartFile photo;
}

@PostMapping(value = "/{id}/contributions/photos")
@ResponseStatus(HttpStatus.CREATED)
public
ResponseEntity<Void> createPhotoContribution(
        @ApiParam(value = "The movie ID", required = true)
        @PathVariable("id") final Long id,
        @ApiParam(value = "The contribution", required = true)
        @RequestBody @Valid final ContributionNew<Photo> contribution
) {

我正在使用postman发送数据。但是,他将我丢弃

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=----WebKitFormBoundarywY7ByvgonAjDoaCT;charset=UTF-8' not supported

我应该为这个控制器设置什么内容类型,这样我就可以发送一个包含纯文本字段和文件列表的对象?
如果我在页眉中设置页眉

Content-type: multipart/form-data; charset=utf-8

它把我扔到控制台里

org.apache.tomcat.util.http.fileupload.FileUploadException: the request was rejected because no multipart boundary was found
laik7k3q

laik7k3q1#

正如dknight @RequestBody表示使用JSON或XML数据Map您的DTO bean。在MultipartFile的情况下,您不能使用JSON数据,因此您不能使用@RequestBody。请尝试使用@ModelAttribute注解。
工作样品:

@PostMapping("/promoters")
@Timed
public ResponseEntity<PromoterDTO> createPromoter(@ModelAttribute PromoterDTO promoterDTO) throws URISyntaxException { ... }

使用这样的PromoterDTO:

public class PromoterDTO implements Serializable {

        private Long id; 

        private String name;

        private String address;

        private MultipartFile logo;
    }
wnvonmuf

wnvonmuf2#

在Postman中,您需要将主体类型设置为raw,并从下拉列表中选择JSON,我也遇到过类似的问题,这解决了我的问题。

nxagd54h

nxagd54h3#

请使用@RequestParam而不是@RequestBody

chy5wohz

chy5wohz4#

使用@ModelAttribute而不是@ResponseBody,因为这会占用键值对中的数据,而后者用于对象(如json)。在访问api时,只需传递对象的multipart类型和json键值对。它工作正常!
stack overflow question on this

olhwl3o2

olhwl3o25#

使用@ModelAttribute代替@RequestBody,如下所示:

@PostMapping(value = "/{id}/contributions/photos")
@ResponseStatus(HttpStatus.CREATED)
public
ResponseEntity<Void> createPhotoContribution(
        @ApiParam(value = "The movie ID", required = true)
        @PathVariable("id") final Long id,
        @ApiParam(value = "The contribution", required = true)
        @ModelAttribute @Valid final ContributionNew<Photo> contribution
) {
krcsximq

krcsximq6#

import org.springframework.web.bind.annotation.ModelAttribute;

使用@ModelAttribute而不是@RequestBody。它对我很有效。

6yt4nkrj

6yt4nkrj7#

必须在控制器中写入produces = {“application/json”}而不是consuments = {“application/json”}

vwoqyblh

vwoqyblh8#

Hi Folks只需更改:@请求正文到@模型属性

public ResponseEntity<DTO> exemple(@ModelAttribute Dto dto) throws TechnicalException

快乐编码。

t40tm48m

t40tm48m9#

下面是使用Sping Boot 2.1.7用Kotlin编写的完整代码示例
示例使用了一个ProfileRepository,当然,您可以实现它。
Kotlin很好,因为data class已经实现了可序列化。

请注意,您必须对模型对象属性使用var,而不是val,否则日志消息中的字段值将为空。

import org.springframework.web.bind.annotation.ModelAttribute
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.multipart.MultipartFile

@RestController
class ExampleController(private val myProfileRepository: ProfileRepository) {
    
    @PostMapping("/api/uploadFile")
    fun createProvider(@ModelAttribute request: CreateProfileRequest): Provider {
        println("received create request with photo: ${request.photo} for the following person ${request.name}")
        return myProfileRepository.save(Provider(name = request.name!!))
    }
}

data class CreateProfileRequest(
    var name: String? = null,
    var photo: MultipartFile? = null
)

相关问题