org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod#invokeAndHandle(webRequest,mavContainer,Object... providedArgs){
// 执行目标方法,详见执行目标方法InvocableHandlerMethod#invokeForRequest原理(最终参数解析,执行目标方法)
Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
// 设置响应状态
setResponseStatus(webRequest);{
// 设置状态码
HttpStatus status = getResponseStatus();
if (status == null) {
return;
}
// 设置响应头信息
HttpServletResponse response = webRequest.getResponse();
if (response != null) {
String reason = getResponseStatusReason();
// 有错误信息,设置错误信息和状态码
if (StringUtils.hasText(reason)) {
response.sendError(status.value(), reason);
}
// 没有错误信息,设置状态码
else {
response.setStatus(status.value());
}
}
// 保存请求状态,被RedirectView用到
webRequest.getRequest().setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, status);
}
// 执行目标方法返回结果不为null
if (returnValue == null) {
// 请求结束了,或者已经设置了状态码,表示请求处理完成
if (isRequestNotModified(webRequest) || getResponseStatus() != null || mavContainer.isRequestHandled()) {
disableContentCachingIfNecessary(webRequest);
mavContainer.setRequestHandled(true);
return;
}
}
// 如果当前请求有错误信息,请求结束
else if (StringUtils.hasText(getResponseStatusReason())) {
mavContainer.setRequestHandled(true);
return;
}
// 请求暂未结束
mavContainer.setRequestHandled(false);
Assert.state(this.returnValueHandlers != null, "No return value handlers");
try {
// 调用返回值处理器接口对响应结果进行处理
this.returnValueHandlers.handleReturnValue(returnValue, getReturnValueType(returnValue), mavContainer, webRequest);{
// 获取返回值处理器
HandlerMethodReturnValueHandler handler = selectHandler(returnValue, returnType);{
// 是否是异步的返回结果
boolean isAsyncValue = isAsyncReturnValue(value, returnType);{
// 遍历所有的返回值处理器
for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) {
// 如果是AsyncHandlerMethodReturnValueHandler这个类型并且isAsyncReturnValue返回true,就符合条件
// 表示可以处理这个异步结果的handler
if (handler instanceof AsyncHandlerMethodReturnValueHandler && ((AsyncHandlerMethodReturnValueHandler) handler).isAsyncReturnValue(value, returnType)) {
return true;
}
}
return false;
}
// 遍历所有的返回值处理器
for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) {
// 有两种情况,异步AsyncHandlerMethodReturnValueHandler处理isAsyncValue异步的结果
// 普通HandlerMethodReturnValueHandler处理普通结果
// 这样做就是避免没必要的判断,例如普通HandlerMethodReturnValueHandler去执行supportsReturnType为异步结果的逻辑,肯定是不符合条件的
// AsyncHandlerMethodReturnValueHandler去执行普通返回结果的supportsReturnType,没有不要
if (isAsyncValue && !(handler instanceof AsyncHandlerMethodReturnValueHandler)) {
continue;
}
// 执行当前Handler是否可以处理这个返回值
if (handler.supportsReturnType(returnType){
return ModelAndView.class.isAssignableFrom(returnType.getParameterType());
// 类中或者方法中是否有@ResponseBody注解
return (AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(), ResponseBody.class) || returnType.hasMethodAnnotation(ResponseBody.class));
}) {
return handler;
}
}
return null;
}
// 到了这里如果没有找到合适的Handler,表示当前返回值无法进行处理,直接报错
if (handler == null) {
throw new IllegalArgumentException("Unknown return value type: " + returnType.getParameterType().getName());
}
// 找到了Handler,使用handler处理返回值 这个只讲处理@ResponseBody的处理器RequestResponseBodyMethodProcessor
handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);{
// 请求处理完成
mavContainer.setRequestHandled(true);
// 创建InputMessage,可以获取Body为InputStream
ServletServerHttpRequest inputMessage = createInputMessage(webRequest);{
HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class);
return new ServletServerHttpRequest(servletRequest);
}
// 创建输出的对象,也是可以获取Body为OutputStream
ServletServerHttpResponse outputMessage = createOutputMessage(webRequest);{
HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
return new ServletServerHttpResponse(response);
}
// 使用消息转换器,写入OutputStream(ServletServerHttpRequest)
writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage);{
// 实现了RequestResponseBodyAdvice的执行链,在创建当前参数解析器的时候就已经将
// 在RequestMappingHandlerAdapter初始化的时候,给参数解析器设置的
// this.requestResponseBodyAdvice就是在RequestMappingHandlerAdapter初始化的时候,执行initControllerAdviceCache();方法
// 从@ControllerAdvice中,实现了requestResponseBodyAdvice的类缓存下来了
// resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), this.requestResponseBodyAdvice));
RequestResponseBodyAdviceChain advice = this.advice;
// 找到对应的媒体类型,使用消息转换器写消息
// 遍历所有的消息转换器
for (HttpMessageConverter<?> converter : this.messageConverters) {
// 判断转换器是否是GenericHttpMessageConverter这种类型
GenericHttpMessageConverter genericConverter = (converter instanceof GenericHttpMessageConverter ? (GenericHttpMessageConverter<?>) converter : null);
// 判断这个GenericHttpMessageConverter是否可以写入这条消息
if (genericConverter != null ?
((GenericHttpMessageConverter) converter).canWrite(targetType, valueType, selectedMediaType){
// 判断当前媒体类型是否支持
if (!canWrite(mediaType)) {
return false;
}
// 找到对应的ObjectMapper进行序列化
ObjectMapper objectMapper = selectObjectMapper(clazz, mediaType);
if (objectMapper == null) {
return false;
}
// 判断ObjectMapper是否可以对当前类型进行序列化
AtomicReference<Throwable> causeRef = new AtomicReference<>();
if (objectMapper.canSerialize(clazz, causeRef)) {
return true;
}
return false;
} :
converter.canWrite(valueType, selectedMediaType)) {
// 调用过ResponseBodyAdvice的beforeBodyWrite方法
// 在写入响应体之前最后对响应值做处理
body = advice.beforeBodyWrite(body, returnType, selectedMediaType,(Class<? extends HttpMessageConverter<?>>) converter.getClass(),inputMessage, outputMessage);{
return processBody(body, returnType, contentType, converterType, request, response);{
// 找到符合条件的ResponseBodyAdvice类
for (ResponseBodyAdvice<?> advice : getMatchingAdvice(returnType, ResponseBodyAdvice.class)) {
// 判断ResponseBodyAdvice是否支持处理当前这个返回值
if (advice.supports(returnType, converterType)) {
// 如果可以处理,就将处理后的结果进行返回
// 我们可以在这个对结果进行统一格式化处理
body = ((ResponseBodyAdvice<T>) advice).beforeBodyWrite((T) body, returnType,contentType, converterType, request, response);
}
}
}
}
if (body != null) {
Object theBody = body;
// 添加响应头要暴露的信息
addContentDispositionHeader(inputMessage, outputMessage);
// 真正写入OutputStream,根据不同类型调用不同类型的write方法
if (genericConverter != null) {
genericConverter.write(body, targetType, selectedMediaType, outputMessage);{
// 添加响应头
final HttpHeaders headers = outputMessage.getHeaders();
addDefaultHeaders(headers, t, contentType);
// 判断响应的结果是不是就是OutputStream信息,如果是,直接返回数据流信息
if (outputMessage instanceof StreamingHttpOutputMessage) {
StreamingHttpOutputMessage streamingOutputMessage = (StreamingHttpOutputMessage) outputMessage;
streamingOutputMessage.setBody(outputStream -> writeInternal(t, type, new HttpOutputMessage() {
@Override
public OutputStream getBody() {
return outputStream;
}
@Override
public HttpHeaders getHeaders() {
return headers;
}
}));
}else{
// 不是响应Stream信息,写入消息
writeInternal(t, type, outputMessage);{
// 获取媒体类型,json编码,响应对象类型
MediaType contentType = outputMessage.getHeaders().getContentType();
JsonEncoding encoding = getJsonEncoding(contentType);
Class<?> clazz = (object instanceof MappingJacksonValue ?((MappingJacksonValue) object).getValue().getClass() : object.getClass());
// 获取ObjectMapper,写入数据
ObjectMapper objectMapper = selectObjectMapper(clazz, contentType);
ObjectWriter objectWriter = (serializationView != null ?
objectMapper.writerWithView(serializationView) : objectMapper.writer());
objectWriter.writeValue(generator, value);
writeSuffix(generator, object);
generator.flush();
}
// 刷新OutputStream
outputMessage.getBody().flush();
}
}
}
else {
((HttpMessageConverter) converter).write(body, selectedMediaType, outputMessage);
}
}
return;
}
}
}
}
}
}
catch (Exception ex) {
throw ex;
}
}
执行目标方法-ServletInvocableHandlerMethod#invokeAndHandle原理
最新推荐文章于 2024-10-06 10:15:57 发布