HttpMessageConverter是Spring的一个重要接口,它负责将请求信息转换为一个对象,将对象输出为响应信息。
DispatcherServlet默认已经安装了RequestMappingHandlerAdapter作为HandlerAdapter的组件实现类,HttpMessageConverter即由RequestMappingHandlerAdapter使用,将请求信息转换为对象,或将对象转换为响应信息。
HttpMessageConverter接口定义了以下几个方法。
① Boolean canRead(Class<?> clazz,MediaType mediaType):
指定转换器可以读取的媒体类型(如text/html、application/json等),MIME媒体类型在RFC2616中定义,详细可以参考:http://www.w3school.com.cn/media/media_mimeref.asp 。
② Boolean canWrite(Class<?> clazz,MediaType mediaType):
指定转换器可以将clazz类型的对象写道响应流中,响应流支持的媒体类型在mediaType中定义。
③ List<MediaType> getSupportedMediaTypes():
该转换器支持的媒体类型。
④ T read(Class<? extends T> clazz,HttpInputMessage inputMessage):
将请求信息流转换为T类型的对象。
⑤ void write(T t,MediaType contentType,HttpOutputMessage outputMessage):
将T类型的对象写到响应流中,同时指定响应的媒体类型为contentType。
————————————————
版权声明:本文为CSDN博主「yongqi_wang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:
import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.List;
import org.apache.poi.ss.formula.functions.T;
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.GenericHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.util.StreamUtils;
import com.alibaba.fastjson.JSON;
import com.amway.pos.base.model.comm.WebRespBody;
public class RestMessageConverter extends AbstractHttpMessageConverter<Object> implements GenericHttpMessageConverter<Object> {
private boolean needGzip = false;
自定义媒体类型
public RestMessageConverter() {
super(new MediaType("application", "x-wisely", Charset.forName("UTF-8")), new MediaType("application", "json", Charset.forName("UTF-8")));
}
只支持WebRespBody类
@Override
protected boolean supports(Class<?> clazz) {
return T.class.isAssignableFrom(clazz);
}
配置WiselyMessageConverter
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
RestMessageConverter converter = new RestMessageConverter();
converters.add(converter);
}
从request里获得构造WebRespBody实例的数据
@Override
protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
TODO Auto-generated method stub
String temp = StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("UTF-8"));
System.out.print("\n=========================="+temp+"\n=========================================");
return null;
}
将WebRespBody实例转换成你想要的字符串格式
@Override
protected void writeInternal(Object t, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
String out = "hello:\n====================================" + t.toString();
outputMessage.getBody().write(out.getBytes());
}
@Override
public boolean canRead(Type type, Class<?> contextClass, MediaType mediaType) {
TODO Auto-generated method stub
if("json".equals(mediaType.getSubtype())){
return true;
}
return false;
}
@Override
public Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
TODO Auto-generated method stub
System.out.println("Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage)");
String temp = StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("UTF-8"));
System.out.print("\n=========================="+temp+"\n=========================================");
Object obj = JSON.parseObject(inputMessage.getBody(), type);
return obj;
}
@Override
public boolean canWrite(Type type, Class<?> clazz, MediaType mediaType) {
TODO Auto-generated method stub
return true;
}
@Override
public void write(Object t, Type type, MediaType contentType, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
Object data = null;
if (t instanceof HashMap) {
data = HashMap) t).get("data");
if (needGzip) {
String str = JSON.toJSONString(data);
data = GZIPUtils.toString(GZIPUtils.compress(str;
HashMap) t).put("data", data);
}
}
if (t instanceof WebRespBody) {
data = ((WebRespBody) t).getData();
if (needGzip) {
String str = JSON.toJSONString(data);
data = GZIPUtils.toString(GZIPUtils.compress(str;
WebRespBody) t).setData(data);
}
}
String json = JSON.toJSONString(t);
outputMessage.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
outputMessage.getBody().write(json.getBytes("UTF-8";
}
public boolean isNeedGzip() {
return needGzip;
}
public void setNeedGzip(boolean needGzip) {
this.needGzip = needGzip;
}
}
@Configuration
public class RestMessageConverterConfig {
@Value("${restapi.response.needgzip:false}")
private boolean needgzip = false;
引入Fastjson解析json,不使用默认的jackson
必须在pom.xml引入fastjson的jar包,并且版必须大于1.2.10
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
RestMessageConverter wiselyMessageConverter = new RestMessageConverter();
wiselyMessageConverter.setNeedGzip(needgzip);
return new HttpMessageConverters(wiselyMessageConverter, converter );
}