我想将一个对象发送到控制器,该对象具有多个包含文件的列表和多个包含纯文本的字段。
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
如前所述,dknight @RequestBody 意味着使用 JSON 或 XML 数据来映射您的 DTO bean。 对于 MultipartFile,您不能使用 JSON 数据,因此不能使用 @RequestBody。 尝试使用@ModelAttribute注释。
工作样本:
@PostMapping("/promoters")
@Timed
public ResponseEntity<PromoterDTO> createPromoter(@ModelAttribute PromoterDTO promoterDTO) throws URISyntaxException { ... }
像这样使用PromoteDTO:
public class PromoterDTO implements Serializable {
private Long id;
private String name;
private String address;
private MultipartFile logo;
}
在 Postman 中,您需要将正文设置为 raw 类型,然后从下拉菜单中选择 JSON,我遇到了类似的问题,这解决了我的问题。
大家好,只需将 @RequestBody 更改为 @ModelAttribute
public ResponseEntity<DTO> exemple(@ModelAttribute DTO dto) throws TechnicalException
快乐编码。
不要使用
@RequestBody
,而是使用 @RequestParam
!
import org.springframework.web.bind.annotation.ModelAttribute;
使用
@ModelAttribute
而不是 @RequestBody
。这对我有用。
使用@ModelAttribute而不是@ResponseBody,因为这会占用键值对中的数据,而后者用于像json这样的对象。 在访问 api 时,只需传递对象的多部分类型和 json 键值对。效果很好!
使用@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
) {
Produces = { "application/json" } 必须写在控制器中,而不是 Consumers = { "application/json" }
这是使用 Spring 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
)