响应流程以向控制台输出json数据格式为例,在控制器里面添加注解@Reponse
@ResponseBody
@RequestMapping("/test/person")
public Person getPerson(){
Person person = new Person();
person.setAge(20);
person.setBrith(new Date());
person.setUserName("张三");
return person;
}
然后进行响应追踪,放行直接追踪到真正实现方法的hadle()处理。
// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
在装配时,先获取到请求的返回值,就是上面需要返回的Person对象。
调用 returnValueHandlers返回值处理器对Person类型进行返回值的处理
ry { this.returnValueHandlers.handleReturnValue( returnValue, getReturnValueType(returnValue), mavContainer, webRequest); }
在进行返回值的处理时,对反回值处理器进行一一匹配,直到找出适合的返回值,这里利用ReponseBodyMethodProcessor进行数据的处理
做循环处理
for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) {
if (isAsyncValue && !(handler instanceof AsyncHandlerMethodReturnValueHandler)) {
continue;
}
if (handler.supportsReturnType(returnType)) {
return handler;
}
}
return null;
}
找到ReponseBodyMethodProcessor之后进行数据的跳转处理
writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage);
在AbstractMessageConverterMethodProcessor.Java里面进行数据格式的匹配
List<MediaType> mediaTypesToUse = new ArrayList<>();
for (MediaType requestedType : acceptableTypes) {
for (MediaType producibleType : producibleTypes) {
if (requestedType.isCompatibleWith(producibleType)) {
mediaTypesToUse.add(getMostSpecificMediaType(requestedType, producibleType));
}
}
}
浏览器支持的类型:
最终后台响应所支持的浏览器类型
对数据选择合适的消息类型转换器进行判断,看是否能够写出数据,匹配到7,8。返回的结果都为True。
判断是否能写出数据,携带三个参数,targetType:Person类型的数据 valueType:参数值
selectMediaType:applocation/json。
if (genericConverter != null ?
((GenericHttpMessageConverter) converter).canWrite(targetType, valueType, selectedMediaType) :
向浏览器写一些数据
if (genericConverter != null) {
genericConverter.write(body, targetType, selectedMediaType, outputMessage);
}
调用消息转换器AbstractJackson2HttpMessageConverter对数据进行处理,请求头、编码方式
MediaType contentType = outputMessage.getHeaders().getContentType();
JsonEncoding encoding = getJsonEncoding(contentType);
JsonGenerator generator = this.objectMapper.getFactory().createGenerator(outputMessage.getBody(), encoding);
try {
writePrefix(generator, object);
最终调用ObjectWritter()写出json数据
if (contentType != null && contentType.isCompatibleWith(MediaType.TEXT_EVENT_STREAM) &&
config.isEnabled(SerializationFeature.INDENT_OUTPUT)) {
objectWriter = objectWriter.with(this.ssePrettyPrinter);
}
objectWriter.writeValue(generator, value);
writeSuffix(generator, object);
generator.flush();
}
返回数据
else {
writeInternal(t, type, outputMessage);
outputMessage.getBody().flush();
}
}
genericConverter.write(body, targetType, selectedMediaType, outputMessage);
writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage);