关于@RequestParam和@RequestBody的讨论

时间:2017-06-20 11:37:50

标签: spring spring-mvc

我有一个班级:

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会找HttpMessageConverterhttp request body转换为class.But我不确定。有人可以向我解释一下吗?

1 个答案:

答案 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一起使用,因此无法缩短(因为它需要显式类型才能工作)。

我希望这至少会让你走上正确的道路。