拒绝一切套路-SpringMVC自定义消息转换器掉坑学习

开始

@RequestBody@ResponseBody这两个注解作用就是在前台向后台传递数据时,把请求报文中的数据通过springmvc的处理成一个我们自己定义的对象,在这个过程中首先springmvc会去请求头中找到一个contentType的属性,然后去匹配能够处理这种类型的消息转换器,而在返回数据时,再把对象转换成响应报文.
contentType是requestHeader中的一个属性,这个头部主要用于说明body中的字符串是什么格式的,比如:text,json,xml,html等。springmvc解析请求时,首先通过此头部,才能确定使用什么格式来解析请求体中的字符串,对于响应报文,浏览器也是要通过这个属性,来确定在如何处理响应报文的返回数据。

第一步建立自己的消息转换器类继承AbstractHttpMessageConverter。并定义我们的媒体类型x-user

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class MyMessageConverter extends AbstractHttpMessageConverter<User> {

public MyMessageConverter(){
super(new MediaType("application","x-user", Charset.forName("utf-8")));
}
@Override
protected boolean supports(Class<?> clazz) {
return User.class.isAssignableFrom(clazz);
}

@Override
protected User readInternal(Class<? extends User> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
String temp= StreamUtils.copyToString(inputMessage.getBody(),Charset.forName("UTF-8"));
Map<String,Object> map =(Map<String,Object>)JSON.parseObject(temp);
User u = new User();
u.setFname((String) map.get("fname"));
u.setLname((String) map.get("lname"));
return u;
}

@Override
protected void writeInternal(User t, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {

}

}

第二步在springMVC配置文件中配置我们的消息转换器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">

<bean class="com.xiaojiling.tool.MyMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json</value>
<value>application/x-user;charset=utf-8</value>
</list>
</property>
</bean>

</mvc:message-converters>
</mvc:annotation-driven>

第三步在Controller中手动指定那个接口可以接收我们定义的媒体类型。

1
2
3
4
5
6
7
8
@RequestMapping(value="/pushData", method = RequestMethod.POST, consumes="application/x-user")
@ResponseBody
public String pushData(@RequestBody User user){
System.out.println(user.getFname());
System.out.println(user.getLname());
return "sussess";

}

最后前端在调用上门接口的时候ContentType需要改成我们定义的类型x-user。里我使用jmeter模拟请求数据。


经过掉坑总结 Spring4.1.6版本死活都得不到想要的结果,自定义的消息转换器没办法生效。后来换成4.3.0版本一切正常。

总结

SpringMVC提供了9种默认的消息转换器,这些转换器能满足大部分需求。

ByteArrayHttpMessageConverter负责读取二进制格式的数据和写出二进制格式的数据;
StringHttpMessageConverter负责读取字符串格式的数据和写出二进制格式的数据;
ResourceHttpMessageConverter负责读取资源文件和写出资源文件数据;
FormHttpMessageConverter负责读取form提交的数据(能读取的数据格式为 application/x-www-form-urlencoded,不能读取multipart/form-data格式数据);负责写入application/x-www-from-urlencoded和multipart/form-data格式的数据;
MappingJacksonHttpMessageConverter负责读取和写入json格式的数据;
SouceHttpMessageConverter负责读取和写入 xml 中javax.xml.transform.Source定义的数据;
Jaxb2RootElementHttpMessageConverter负责读取和写入xml 标签格式的数据;
AtomFeedHttpMessageConverter负责读取和写入Atom格式的数据;
RssChannelHttpMessageConverter负责读取和写入RSS格式的数据;

0%