当前位置: 代码迷 >> 综合 >> 【Spring】@ResponseBody
  详细解决方案

【Spring】@ResponseBody

热度:34   发布时间:2023-12-22 01:36:36.0

1.简介

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

2.原理     

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

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

	@Overridepublic boolean supportsReturnType(MethodParameter returnType) {return (AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(), ResponseBody.class) ||returnType.hasMethodAnnotation(ResponseBody.class));}
	@Overridepublic 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值,然后进行封装。

 

  相关解决方案