Je veux envoyer un objet au contrôleur qui a plusieurs listes avec des fichiers et plusieurs champs avec du texte brut.
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
) {
J'envoie des données en utilisant facteur . Cependant, il me jette
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=----WebKitFormBoundarywY7ByvgonAjDoaCT;charset=UTF-8' not supported
Que dois-je définir le type de contenu pour ce contrôleur afin que je puisse envoyer un objet qui a des champs de texte brut et des listes avec des fichiers?
Si je mets l'en-tête dans l'en-tête
Content-type: multipart/form-data; charset=utf-8
ça me jette dans la console
org.Apache.Tomcat.util.http.fileupload.FileUploadException: the request was rejected because no multipart boundary was found
dans postman, vous devez définir le corps comme étant de type raw, et dans le menu déroulant, vous pouvez sélectionner JSON, j'ai eu un problème similaire, cela a résolu mon problème . voir l'écran ici
Comme dit dknight @RequestBody signifie l'utilisation de données JSON ou XML avec des cartes de votre bean DTO. Dans le cas de MultipartFile, vous ne pouvez pas utiliser de données JSON, vous ne pouvez donc pas utiliser @RequestBody. Essayez avec l'annotation @ModelAttribute.
Échantillon de travail:
@PostMapping("/promoters")
@Timed
public ResponseEntity<PromoterDTO> createPromoter(@ModelAttribute PromoterDTO promoterDTO) throws URISyntaxException { ... }
Avec PromoterDTO comme ceci:
public class PromoterDTO implements Serializable {
private Long id;
private String name;
private String address;
private MultipartFile logo;
}
Au lieu de @RequestBody, utilisez @ModelAttribute comme,
@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
) {
Au lieu de @RequestBody, utilisez @RequestParam !!!