问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何让Spring MVC接收的参数可以转换为java对象

发布网友 发布时间:2022-05-11 04:21

我来回答

2个回答

懂视网 时间:2022-05-18 15:37

由于快过年的原因,项目组没有太多任务,闲来无事研究了一下spring中restful调用。发现spring竟然已经强大到如此境界,程序员已经不需要在关心在写接口的过程中数据的转换以及调用,只需要专注业务。下面我总结一下步骤及其在研究过程的遇到的问题。

步骤:

1、git clone https://github.com/spring-guides/gs-rest-service.git 从spring官网上下载了源码

2、进行maven编译(gradle也行)

3、运行、访问http://localhost:8080/greeting

4、运行结果能把对象转换为json对象返回给页面

这时我就在思考怎样能让请求的数据自动转换为java对象呢,通过google,发现其实spring已经提供了HttpMessageConverter转换器,而且默认情况下是加载了 MappingJackson2HttpMessageConverter(json ~object转换的类)。只需要配置@RequestBody Greeting gree 即可使用。

controller层代码如下:



这时候我通过谷歌的插件(postman)进行调用,死活调用不成功!

分析问题及解决问题:

这时我感觉问题的原因可能出在如下几个方面:

1、spring默认没有加载MappingJackson2HttpMessageConverter(不知道具体加载方式)

2、MappingJackson2HttpMessageConverter加载后不能工作(不知道不工作原因)

其实最后面导致不工作的原因是太相信spring的源码(对象没有提供set方法导致),带着这两疑问在网上海量搜索者找不到对应结果。没有办法只能从根本上找到问题原因,看spring源代码。

针对第一个问题:

第一步:手动重写加载类型转换器



测试发现还是不能使用,这时就更不清楚原因了。只能看默认情况下spring是怎么加载类型转换器的。结果发现在WebMvcConfigurationSupport中这个方法addDefaultHttpMessageConverters(HttpMessageConverter这个关键字反射搜索到使用地方通过判断及其跟踪找到的)中如下代码:



已经加载了相应的默认转换器。断点调试说明默认配置是没有问题的。

只能说明是第二个问题导致的,但是不知道为什么导致这个问题(json数据问题,还是其他问题),在不知道问题的情况下,只能看request请求过来,转换器是怎么工作的。因为本人对spring不是特别了解,所以不知其原理。在这种情况下还是只能根据(HttpMessageConverter)关键类找到相应使用地方。以经验进行判断和调试。发现在AbstractMessageConverterMethodArgumentResolver中的readWithMessageConverters方法是request请求过来进行类型转换的处理方法。



这时候发现其实已经根据HttpMessageConverter的canRead方法已经找到了对应的类型消息转换器MappingJackson2HttpMessageConverter,而且已经开始进行转换了,只是抛出了运行时异常。因为异常没有在控制台输出。我通过断点调试发现MappingJackson2HttpMessageConverter的readJavaType方法抛出运行时异常,通过源代码发现底层是用的jackson的objectMapper进行操作的,代码如下:



如是我就把代码单独拿出来在main方法里面运行,还是不行,这时我就好定位问题了。要不是类型错误,要不是输入数据错误。仔细检查发现json数据没有问题,用jsonobject也能进行转换。这时只能判断是传入的javaType有问题导致的。如是我打开发现对象(Greeting)没有set方法,我想是不是因为此jakson没法工作呢(原理不清楚)。如是乎我给此对象提供了set方法,再运行可以了。绕了一圈终于把问题解决了,但是通过这个问题让我更加清楚了spring的restful的工作机制。

热心网友 时间:2022-05-18 12:45

可以使用@RequestBody注解:

@RequestMapping(value = "user/saveUser"", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> result(@RequestBody User user) {
userService.saveUser(user);
}

这个注解是将Json字符串转换成java对象,所以需要在前端通过JSON.stringify()方法将json对象转换成json字符串
var user = {"userName":"test","address":"gz"};
$.ajax({
type:"POST",
url:"user/saveUser",
dataType:"json",
contentType:"application/json",
data:JSON.stringify(user ),
success:function(data){

}
});

这只是一种方法,还可以使用fastjson工具包,将前端传回的json字符串转换成对应的java对象
或者List<User>

User user=JSON.parseObject(user, User.class);
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
贷款的话首付准备多少米能提A6L? 运来怎么造句 ...急死了,大家看清楚是不显示,不是没法输入啊,有没有高手指教_百度知 ... wps插入sjqy字体(wps文字添加艺术字体) sjqy钢筋符号字体怎么安装(sjqy钢筋符号字体怎么安装到wps) 钢筋符号等级怎么在wps输入? ...另一台显示乱码。看图。SJQY字库已安装。求解。在线等。 布艺沙发甲醛多久挥发 梦幻国度里那些艺术的装备,黄金的装备怎么来的? 梦幻国度点解有人会全身发光的 朗气压缩机械(上海)有限公司怎么样? 怎么描述热泵产品广泛普通使用 空压机论坛有哪些? 苹果接收不到钉钉抖音微信通知 准贷记卡透支具体怎么理解啊,和贷记卡混在一起有点不好区别! 二年级下册期中考试数学 郑州管城区下学期期末测试卷二年级数学 准贷记卡呆账,余额为5元,这是什么意思 遗嘱继承房产过户税费怎么算的呢 微信好友被删了,自己又不知道他的了。怎么找回? 电脑怎么登录两个 如何在电脑上登录多个 锐族x02怎么换壁纸? 锐族x02 4g用什么存储卡 你好,试了几次,这个窗的玻璃还是打不开? 高层窗户密封不好怎么办 酷世s1和锐族X05哪款mp3好? 高层住户的窗户坏了属于房屋本体维修基金范围吗 高层住宅窗户导轮坏了如何报修? 淘宝怎么样撤销退款申请 springboot json字符串参数怎么转实体 在html内的文本框中输入json格式的数据,如何将串数据转成json对象。 后台应该如何取到前端传来的json对象 前端获得的json数据怎么展示 怎样在前端解析由后端传输过来的json json如何解析存在对象里的数据 json如何解析存在对象里的数据,有没有... 有哪个好心人介绍一下南京好玩儿,有中国特色,能体现中国文化的旅游景点吗? 江苏有山有水的旅游景点 南京莫愁湖门票多少钱 养老保险代理是怎么回事? 会计代理记账公司必须为员工缴纳养老保险和医疗保险吗 医院人事代理交养老保险呗 国有企业养老保险,企业通过私人代理商缴纳合法吗? 社保代缴公司交社保和个人交社保是一样的吗 微信打开小程序有什么步骤? 基金持有3年亏损的概率 淘宝网咨询客服电话号码是多少 QQ三国 密码和安全码都丢了 什么找回?? QQ三国角色密码忘了,密码保护也忘记了,还有其他的途径找回密码吗? 我是1982年农历正月十三出生的,早晨三点多(应该是寅时)。请帮帮忙用易经测算一下,我取个什么名字更好