Content type 'multipart/form-data;boundary=----...;charset=UTF-8' not supported

84,405

Solution 1

As said dknight @RequestBody means use of JSON or XML data with maps your DTO bean. In case of MultipartFile you can't use JSON data so you can't use @RequestBody. Try with @ModelAttribute annotation.

Working sample :

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

With PromoterDTO like this :

    public class PromoterDTO implements Serializable {

        private Long id; 

        private String name;

        private String address;

        private MultipartFile logo;
    }

Solution 2

In Postman, you need to set the body to be of type raw, and from the drop down you can select JSON, I had a similar issue, this fixed my issue.

view screen here

Solution 3

Instead of @RequestBody, use @RequestParam!

Solution 4

use @ModelAttribute instead of @ResponseBody as this takes up data in key value pairs and the later is used for an object like, json. While hitting the api simply pass the multipart type and json key value pairs of the object. It works fine!

stack overflow question on this

Solution 5

Instead of @RequestBody, use @ModelAttribute like,

@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
) {
Share:
84,405
Admin
Author by

Admin

Updated on May 27, 2021

Comments

  • Admin
    Admin almost 3 years

    I want to send an object to the controller that has several lists with files and several fields with plain text.

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

    I am sending data using postman. However, he throws me away

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

    What should I set the Content-type for this controller so that I can send an object that has fields of plain text and lists with files?

    If I set the header in the header

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

    it throws me in the console

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