Springboot 项目 Controller同时接收MultipartFile数据和json数据

转载参考: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前面


版权声明:本文为x2hg123原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。