我有一个班级:
public class user{
private String id;
private MultiPartFile file;
**Getters And Setters**
}
在控制器中:
@PostMapping(value="/upload)
public void upload(User user){
}
在前端我使用form-data发布数据。我可以获取用户对象。
但是当我添加@RequestBody
和@RequestParam
时,它无法正常工作。
在我看来,@RequestParam
用于将参数绑定到简单类。当我使用@RequestBody
时,spring会找HttpMessageConverter
将http request body
转换为class.But我不确定。有人可以向我解释一下吗?
答案 0 :(得分:1)
所以,我相信我们正在谈论org.springframework.web.multipart.MultipartFile
,它将与@RequestParam
变量一起使用。在这种情况下,这种机制有点特殊。
我遇到了类似的问题,我最终使用的是org.springframework.web.multipart.commons.CommonsMultipartResolver
。从前端我构建了包含两部分的多部分请求,在您的场景中它可以是user
(仅包含JSON数据)和file
(包含文件本身),例如:
@PostMapping(value="/upload")
public void upload(@RequestParam("user") User user, @RequestParam("file") MultipartFile file){
...
}
但是,您需要配置User
部分的自定义序列化,这可以使用org.springframework.web.multipart.commons.CommonsMultipartResolver
来完成。您可以使用bean配置来配置它:
@Configuration
public class MappingConfig {
@Order(Integer.MIN_VALUE)
@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
return new CommonsMultipartResolver();
}
@Bean
public Converter<String, User> stringToUser() {
return new Converter<String, User>() {
@Override
public User convert(String jsonString) {
return new Gson().fromJson(jsonString, User.class);
}
};
}
...
}
另外,正如您所看到的,我手动使用Gson
,我找不到更好的方法。此外,它不能与Java 8 lambdas一起使用,因此无法缩短(因为它需要显式类型才能工作)。
我希望这至少会让你走上正确的道路。