【Spring】@ResponseBody

1.简介

很多web接口,即控制层(controller)的方法一般会返回一个页面给客户端显示,但有的接口是Restful接口,比如客户端想要一个json串。我们可以使用@ResponseBody,标记在controller方法上,可以实现将方法的返回值以特定格式写入到response的body返回给客户端。如果返回值是字符串,那么直接将字符串写到客户端;如果是一个对象,会将对象转化为json串,然后写到客户端。

2.原理     

控制层方法的返回值是如何转化为json格式的字符串的?

看上图的调用链,HandlerMethodReturnValueHandlerComposite组合器会遍历所有的HandlerMethodReturnValueHandler看是否支持该返回值,在RequestResponseBodyMethodProcessor中判断这个接口有没有标记@ResponseBody注解,如果标记了就会调用这这个类做返回值的处理handleReturnValue()。

	@Override
	public boolean supportsReturnType(MethodParameter returnType) {
		return (AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(), ResponseBody.class) ||
				returnType.hasMethodAnnotation(ResponseBody.class));
	}
	@Override
	public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType,
			ModelAndViewContainer mavContainer, NativeWebRequest webRequest)
			throws IOException, HttpMediaTypeNotAcceptableException, HttpMessageNotWritableException {

		mavContainer.setRequestHandled(true);
		ServletServerHttpRequest inputMessage = createInputMessage(webRequest);
		ServletServerHttpResponse outputMessage = createOutputMessage(webRequest);

		// Try even with null return value. ResponseBodyAdvice could get involved.
		writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage);
	}

writeWithMessageConverters()其实是通过HttpMessageConverter中的方法实现的,

它本是一个接口,在其实现类完成转换。如果是bean对象,会调用对象的getXXX()方法获取属性值并且以键值对的形式进行封装,进而转化为json串。如果是map集合,采用get(key)方式获取value值,然后进行封装。

发布了98 篇原创文章 · 获赞 72 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sarafina527/article/details/104399301