转载参考:https://blog.csdn.net/weixin_44673757/article/details/106914356
同时接收文件类型数据和json数据时写法如下,其中TestRequest前不用加@RequestBody注解。
个人认为:此处content-type的类型为:multipart/form-data ,表示表单中进行文件上传。
由于参数中的MultipartFile类型影响了requestbody本应所对应的content-type: application/json,可能是MultipartFile的媒体类型优先级高,会覆盖application/json。
注意点:
files参数位置写在request前面。
一、普通用法:
@Contoller
public class TestController {
/**
* @param file 上传文件
* @param request 文本对象数据
**/
@PostMapping("/update")
public String update(MultipartFile[] files, TestRequest request) {
// 方法省略
}
}
二、加入校验用法:
TestContoller.java :
@Contoller
public class TestController {
/**
* @param file 上传文件
* @param request 文本对象数据
**/
@PostMapping("/update")
public String update(MultipartFile[] files, @Valid TestRequest request, Errors errors) {
// 这里可以对errors进行处理
}
}
TestRequest.java:
public class TestRequest {
@NotBlank(message = "id不能为空")
private String id;
@NotBlank(message = "name不能为空")
private String name;
// 忽略getter、setter
}
遇到问题:
- 正常情况下当传入request数据时,假设传入的id值为空,spring校验时便会生成error信息,放入到Controller的errors对象中,我们只要在Controller中处理这个errors,返回给前端即可。
- 但是如果files参数位置放在request后面,校验数据时产生的error信息会直接打在控制台上,同时直接给前端返回500的错误,而不是进入Controller方法内部中让我们自己处理。
解决方案:files参数位置写在request前面