SpringMVC restful 注解之注解之@RequestBody进行进行json与与object
转换转换
主要介绍了SpringMVC restful 注解之@RequestBody进行json与object转换的相关资料,需要的朋友可以参考下
由于快过年的原因,项目组没有太多任务,闲来无事研究了一下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层代码如下:
@RequestMapping(value = "/greeting", method = RequestMethod.POST,consumes = "application/json")
public @ResponseBody Greeting greeting(@RequestBody Greeting gree) {
System.out.println(gree.getContent());
return gree;
}
这时候我通过谷歌的插件(postman)进行调用,死活调用不成功!
分析问题及解决问题:
这时我感觉问题的原因可能出在如下几个方面:这时我感觉问题的原因可能出在如下几个方面:
1、spring默认没有加载MappingJackson2HttpMessageConverter(不知道具体加载方式)
2、MappingJackson2HttpMessageConverter加载后不能工作(不知道不工作原因)
其实最后面导致不工作的原因是太相信spring的源码(对象没有提供set方法导致),带着这两疑问在网上海量搜索者找不到对应
结果。没有办法只能从根本上找到问题原因,看spring源代码。
针对第一个问题:
第一步:手动重写加载类型转换器第一步:手动重写加载类型转换器
@Configuration
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter {
public void configureMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
System.out.println("init convert is start !!!!!");
StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
stringConverter.setWriteAcceptCharset(false);
messageConverters.add(new MappingJackson2HttpMessageConverter());
System.out.println("init convert is stop !!!!!");
}
}
测试发现还是不能使用,这时就更不清楚原因了。只能看默认情况下spring是怎么加载类型转换器的。结果发现在
WebMvcConfigurationSupport中这个方法addDefaultHttpMessageConverters(HttpMessageConverter这个关键字反射搜索到
使用地方通过判断及其跟踪找到的)中如下代码:
@SuppressWarnings("deprecation")
protected final void addDefaultHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
stringConverter.setWriteAcceptCharset(false);
messageConverters.add(new ByteArrayHttpMessageConverter());
messageConverters.add(stringConverter);
messageConverters.add(new ResourceHttpMessageConverter());
messageConverters.add(new SourceHttpMessageConverter<Source>());
messageConverters.add(new AllEncompassingFormHttpMessageConverter());
评论0