Spring 关于@RequestParam和@RequestBody的讨论

Spring 关于@RequestParam和@RequestBody的讨论,spring,spring-mvc,Spring,Spring Mvc,我有一门课: public class user{ private String id; private MultiPartFile file; **Getters And Setters** } 在控制器中: @PostMapping(value="/upload) public void upload(User user){ } 在前端,我用表单数据发布数据。我可以得到用户对象。 但是当我添加@RequestBody和@RequestParam时,它就不能工作了

我有一门课:

public class user{
    private String id;

    private MultiPartFile file;
    **Getters And Setters**
}
在控制器中:

@PostMapping(value="/upload)
public void upload(User user){
}
在前端,我用表单数据发布数据。我可以得到用户对象。 但是当我添加
@RequestBody
@RequestParam
时,它就不能工作了


我认为,
@RequestParam
用于将参数绑定到简单类。当我使用
@RequestBody
时,spring会找到
HttpMessageConverter
来将
http请求body
转换为类。但我不确定。有人能给我解释一下吗?

所以,我相信我们谈论的是
org.springframework.web.multipart.MultipartFile
,它将与
@RequestParam
变量一起使用。这种机制在这种情况下有些特殊

我遇到了一个类似的问题,我最终使用的是
org.springframework.web.multipart.commons.commons multipartresolver
。从前端开始,我构建了包含两部分的多部分请求,在您的场景中,它可以是
用户
(仅包含JSON数据)和
文件
(包含文件本身),例如:

但是,您需要配置
用户
部分的自定义序列化,这可以使用
org.springframework.web.multipart.commons.commons多部分解析器
完成。您可以使用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);
            }
        };
    }
...
}
@配置
公共类映射配置{
@顺序(整数。最小值)
@Bean(name=“multipartResolver”)
公共Commons multipartResolver multipartResolver(){
返回新的CommonsMultipartResolver();
}
@豆子
公共转换器stringToUser(){
返回新转换器(){
@凌驾
公共用户转换(字符串jsonString){
返回新的Gson().fromJson(jsonString,User.class);
}
};
}
...
}
另外,正如您所看到的,我正在手动使用
Gson
,我找不到更好的方法。此外,它不适用于Java8Lambdas,因此不能缩短(因为它需要显式类型才能工作)


我希望这至少能为您指明一条正确的道路。

谢谢您的申请。似乎您使用了
Converter
httpRequest
转换为
对象
。我尝试了,但没有成功。我的应用程序使用
RequestParamMethodArgumentResolver
来执行该操作。当我删除
@RequestParam
时。春天是如何工作的?它是如何不工作的?做同一件事有多种方法,所以你可能需要选择一种方法。我不确定我是否理解了最初的问题,但我上面发布的代码对我和我描述的场景都有效。我将它添加到我的spring boot应用程序中。当我的应用程序分析
@RequestParam用户
时,它使用
requestparamethodargumentresolver
。所以我不知道如何配置bean
转换器
。你说它没有任何效果是什么意思?配置是否未注册?如果调试bean创建,它不会被调用吗?我添加了
@Configuration
。我检查了
bean
是否已经创建。但是spring不使用此转换器来传输参数。
@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);
            }
        };
    }
...
}