11、响应数据


【尚硅谷】SpringBoot2零基础入门教程-讲师:雷丰阳
笔记

路还在继续,梦还在期许

1、响应JSON

1.1、引入开发场景

引入WEB场景

<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场景引入了JSON处理的相关依赖

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.11.2</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jdk8</artifactId>
  <version>2.11.2</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jsr310</artifactId>
  <version>2.11.2</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.module</groupId>
  <artifactId>jackson-module-parameter-names</artifactId>
  <version>2.11.2</version>
  <scope>compile</scope>
</dependency>

1.2 、jackson.jar + @ResponseBody

@Controller
public class ResponseTestController {
   

    @ResponseBody
    @GetMapping("/test/person")
    public Person getPerson() {
   
        Person person = new Person();
        person.setAge(28);
        person.setBirth(new Date());
        person.setUserName("zhangsan");
        return person;
    }
}

给前端自动返回JSON数据

1、装填返回值处理器

位置:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

invokeHandlerMethod 方法

if (this.returnValueHandlers != null) {
   
	invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
}

在这里插入图片描述

2、返回值初步处理

位置:org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod

invokeAndHandle 方法

/**
 * Invoke the method and handle the return value through one of the
 * configured {@link HandlerMethodReturnValueHandler HandlerMethodReturnValueHandlers}.
 * @param webRequest the current request
 * @param mavContainer the ModelAndViewContainer for this request
 * @param providedArgs "given" arguments matched by type (not resolved)
 */
public void invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer mavContainer,
		Object... providedArgs) throws Exception {
   

	// 请求执行后,返回一个返回值对象
	Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
	// 返回浏览器状态码
	setResponseStatus(webRequest);

	// 如果返回一个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);
	}
	catch (Exception ex) {
   
		if (logger.isTraceEnabled()) {
   
			logger.trace(formatErrorForReturnValue(returnValue), ex);
		}
		throw ex;
	}
}

3、获取并使用返回值处理器

位置:org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite

handleReturnValue 方法

/**
 * Iterate over registered {@link HandlerMethodReturnValueHandler HandlerMethodReturnValueHandlers} and invoke the one that supports it.
 * @throws IllegalStateException if no suitable {@link HandlerMethodReturnValueHandler} is found.
 */
@Override // 处理返回值
public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType,
		ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
   

	// 获取returnValue(返回值)与returnType(返回值类型),寻找哪个handler (返回值处理器)可以处理
	HandlerMethodReturnValueHandler handler = selectHandler(returnValue, returnType);
	if (handler == null) {
   
		throw new IllegalArgumentException("Unknown return value type: " + returnType.getParameterType().getName());
	}
	// 使用返回值处理器处理
	handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
}

4、观察如何获取返回值处理器

位置:org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite

selectHandler 方法

@Nullable
private HandlerMethodReturnValueHandler selectHandler(@Nullable Object value, MethodParameter returnType) {
   
	// 是不是一个异步返回值(遍历循环所有返回值处理器),都不是会返回false
	boolean isAsyncValue = isAsyncReturnValue(value, returnType);
	// 遍历循环所有返回值处理器
	for (HandlerMethodReturnValueHandler handler : this
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值