springmvc-自定义消息转换器

时间:2022-03-18 07:01:00

最近的项目没有用到这个,先把自己自学跑通的例子先帖出来,供自己以后参考吧!

如有不对地方望指出!

一、自定义类实现AbstractHttpMessageConverter

 package com.dzf.converter;

 import java.io.IOException;
import java.nio.charset.Charset; import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.util.StreamUtils; import com.alibaba.fastjson.JSONObject;
import com.dzf.vo.ResultInfo;
/**
* 自定义消息转换器
* @author dingzf
* @date 2018年1月20日
* @time 19:26:39
*/
public class MyMessageConverter extends AbstractHttpMessageConverter<ResultInfo> { public MyMessageConverter(){
super(Charset.forName("utf-8"),new MediaType("application","x-result"));//application/x-result 自己定义的媒体数据类型
} //所映射的model
@Override
protected boolean supports(Class<?> clazz) {
return ResultInfo.class.isAssignableFrom(clazz);
} @Override
protected ResultInfo readInternal(Class<? extends ResultInfo> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
String copyToString = StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("utf-8"));//传输为json类型的数据
ResultInfo result = (ResultInfo)JSONObject.parse(copyToString);//转换为自己想要的数据类型 按需编写
return result;
} @Override
protected void writeInternal(ResultInfo t, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
String str = t.getCode()+"-"+t.getDesc();//返回到前台的数据
outputMessage.getBody().write(str.getBytes());
} }

二、在springmvc的配置文件中加入我们自定义的消息转换器

 <!--
打开springmvc的注解模式
mvc 请求映射 处理器与适配器配置 -->
<mvc:annotation-driven >
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter" ><!--字符串转换器-->
<property name = "supportedMediaTypes">
<list>
<value>application/json;charset=utf-8</value>
<value>text/html;charset=utf-8</value>
</list>
</property>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" /><!--json转换器-->
<bean class ="com.dzf.converter.MyMessageConverter"> <!--自己定义的消息转换器-->
<property name = "supportedMediaTypes">
<list>
<value>application/json;charset=utf-8</value>
<value>application/x-result;charset=utf-8</value>
<value>text/html;charset=utf-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

三、在前台指定发送数据的格式

 function test6(){
$.ajax({
type:'post',
url:'json/test6',
contentType:'application/x-result',
data:{code:"200",desc:"我是丁振锋"},
success:function(text){
alert(text);
},
error:function(data){
alert("后台异常!")
},
asyn:false,
cache:false
});
}

四、服务器端指定返回的数据格式

 /**
* 测试自定义消息转换器
* 在请求头上必须加上produces="application/x-result;charset=utf-8"
* @param request
* @param response
* @return
*/
@RequestMapping(value="/test6",produces="application/x-result;charset=utf-8")
@ResponseBody
public ResultInfo test6(HttpServletRequest request,HttpServletResponse response){
ResultInfo result = new ResultInfo();
result.setCode("200");
result.setDesc("请求成功!");
Map<String,String> map = new HashMap<String,String>();
map.put("name", "红霞");
map.put("age","22");
result.setData(map);
return result;
}

到这里,基本上就结束了!

注意点:

1.请求头的contentType必须要设值你自定义的数据格式

2.返回数据格式如果需要使用你自定义的数据格式,加上路由设置。即:produces="application/x-result;charset=utf-8"