一、HttpMessageConverter<T>
接口
HttpMessageConverter<T>
接口负责将请求信息转换为一个对象(类型为T
),将对象(类型为T
)输出为响应信息。
-
boolean canRead(Class<?> var1, @Nullable MediaType var2)
指定转换器可以读取的对象类型,即转换器是否可将请求信息转换为clazz
类型的对象,同时指定支持MIME
类型(text/html
,application/json
等)。 -
boolean canWrite(Class<?> var1, @Nullable MediaType var2)
指定转换器是否可将clazz
类型的对象写到响应流中,响应流支持的媒体类型在MedicaType
中定义。 -
List<MediaType> getSupportedMediaTypes()
获取该转换器支持的媒体类型。 -
T read(Class<? extends T> var1, HttpInputMessage var2) throws IOException, HttpMessageNotReadableException
将请求信息流转换为T
类型的对象,类似使用@RequestBody
读取请求体,封装成Employee
对象。 -
void write(T var1, @Nullable MediaType var2, HttpOutputMessage var3) throws IOException, HttpMessageNotWritableException
将T
类型的对象写到响应流中,同时指定相应的媒体类型为contentType
,类似使用@ResponseBody
将Employee
集合转换为json字符串响应回去。
其中HttpInputMessage
就是一个输入流,它封装了请求信息
public interface HttpInputMessage extends HttpMessage {
InputStream getBody() throws IOException;
}
HttpOutputMessage
就是一个输出流
public interface HttpOutputMessage extends HttpMessage {
OutputStream getBody() throws IOException;
}
二、HttpMessageConverter<T>
接口的实现类
加入jackson的jar包之后,RequestMappingHandlerAdapter
装配的HttpMessageConverter
如下:
StringHttpMessageConverter
只支持String
类型,其它也是一样,泛型参数是固定类型
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String>
而MappingJackson2HttpMessageConverter
继承父类AbstractJackson2HttpMessageConverter
public class MappingJackson2HttpMessageConverter extends AbstractJackson2HttpMessageConverter
父类AbstractJackson2HttpMessageConverter
有继承父类AbstractGenericHttpMessageConverter<Object>
,它支持Object
类型转换,所以MappingJackson2HttpMessageConverter
也就支持所有的类型的对象
public abstract class AbstractJackson2HttpMessageConverter extends AbstractGenericHttpMessageConverter<Object>
MappingJackson2HttpMessageConverter
中的writePrefix
方法相当于把对象转换为json字符串发送出去
protected void writePrefix(JsonGenerator generator, Object object) throws IOException {
if (this.jsonPrefix != null) {
generator.writeRaw(this.jsonPrefix);
}
}