目录
7.4.1.1 jackson.jar+@ResponseBody---返回值处理器
7.4.2 HTTPMessageConverter(消息转换器)原理
7.4.3.4 自定义MessageConverter消息转换器
第七章 Web开发
7.4 数据响应与内容协商
7.4.1 响应JSON
7.4.1.1 jackson.jar+@ResponseBody---返回值处理器
项目中引入web的依赖场景,而web的依赖场景中已经引用了josn的依赖场景,不需要我们自己手动引入依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
web场景自动引入了json场景
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
<version>2.3.4.RELEASE</version>
<scope>compile</scope>
</dependency>
json场景中又引入了jackson的依赖:
- 返回值处理器。
- 经过之前说过的请求参数处理,执行相应的方法后得到返回值,进入ServletInvocableHandlerMethod类的invokeAndHandle方法:
public void invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer mavContainer,
Object... providedArgs) throws Exception {
Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
setResponseStatus(webRequest);
//如果当前返回值为空
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);
}
catch (Exception ex) {
if (logger.isTraceEnabled()) {
logger.trace(formatErrorForReturnValue(returnValue), ex);
}
throw ex;
}
}
try { this.returnValueHandlers.handleReturnValue( returnValue, getReturnValueType(returnValue), mavContainer, webRequest); }
- 进入HandlerMethodReturnValueHandlerComposite类的handleReturnValue方法:
- selectHandle方法就是查找哪个返回值处理器可以处理当前的返回值类型:
-
返回值处理器判断是否支持