디렉토리
1. 메시지 변환기는 무엇입니까?
@RequestBody @ResponseBody 두 특수 완료 요청 개체에 메시지 및 전환 메시지에 응답하여 상기 대상이었다.
이 유연한 기본 메시지 변환기구는 새로 Spring3.x HttpMessageConverter를 유형, 즉 메시지 변환 메커니즘을 도입한다.
HttpMessageConverter 기본 인터페이스 및 다양한 서브 클래스 (StringHttpMessageConverter 등), 메시지 변환기이 메커니즘에 대한 책임.
2 메시지 변환기 구조 : HttpMessageConverter
도는 다음의 메시지 컨버터의 구조
- HttpInputMessage이 인터페이스는 HTTP 요청 패킷 추상의 내부는 SpringMVC
- HttpOutputMessage이 인터페이스는 메시지 내부 SpringMVC 추상적 인 HTTP 응답입니다
- HttpMessageConverter 메시지 변환기 최고 수준의 추상적 인 인터페이스에서이 인터페이스
- 이는, 기준 수신기로서 HttpInputMessage () 메소드를 판독 된 요구 메시지를 판독 담당
- canRead () 메소드는 요청 패킷 메시지 컨버터에 의해 처리 될 수 있는지 여부를 결정할 책임
- 데이터 기록 응답 패킷에 대한 책임 기준 수신기 HttpOutputMessage 같이 그 기록 () 메소드
- CanWrite라고 () 메소드는 응답 메시지가 메시지 컨버터에 의해 처리 될 수 있는지 여부를 결정할 책임
인터페이스 설명 도표 :
요청 처리 방법이 도시되어있다 :
3, 봄 호출 로직
3.1 HandlerMethodArgumentResolver 인터페이스 및 인터페이스 HandlerMethodReturnValueHandler
이 문장은 두 개의 인터페이스입니다 방법을 정의합니다. 구체적인 구현은 마지막 치료입니다.
- HandlerMethodArgumentResolver 요청 메시지 처리 방법 파라미터 전략 인터페이스에 바인딩
- HandlerMethodReturnValueHandler 인터페이스 처리 전략의 처리 방법의 반환 값이다.
3.2 RequestResponseBodyMethodProcessor 类
- 이 클래스는 인터페이스와 HandlerMethodArgumentResolver HandlerMethodReturnValueHandler 인터페이스를 모두 구현합니다. 분석 방법의 매개 변수와 반환 값이 두 역할을 처리로는 역할을합니다.
3.2.1 HandlerMethodArgumentResolver 구현 인터페이스 (resolveArgument () 메소드)
- 소스 코드를 볼 수있는 여기에 유일한 논리적 인 설명을 달성 할 수있다 참조하십시오.
- 로 돌립니다 :) (resolveArgument () 메소드 → readWithMessageConverters 방법 → super.readWithMessageConverters을 () 메소드
- 그럼 당신은 읽기 () 메서드를 호출하여 검증 후 첫 번째 통화 HttpMessageConverter canRead의 () 메소드를 볼 수 있습니다.
3.2.2 HandlerMethodReturnValueHandler 구현 인터페이스 (handleReturnValue () 메소드)
- 소스 코드를 볼 수있는 여기에 유일한 논리적 인 설명을 달성 할 수있다 참조하십시오.
- 依次进入:handleReturnValue()方法→writeWithMessageConverters()方法[参数不同]→writeWithMessageConverters()方法[参数不同]
- 然后可以看到先调用HttpMessageConverter的canWrite()方法,校验通过后调用write()方法。
4、HttpMessageConverter子类及其在SpringMVC中的使用
以我们代码中的一个配置作为说明,并具体理解这个加载过程:
<mvc:annotation-driven>
<mvc:message-converters>
<ref bean="fastJsonHttpMessageConverter"/>
<ref bean="sourceHttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
<bean id="sourceHttpMessageConverter"
class="org.springframework.http.converter.xml.SourceHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/xml;charset=UTF-8</value>
<value>text/xml;charset=UTF-8</value>
</list>
</property>
</bean>
<bean id="fastJsonHttpMessageConverter"
class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
4.1 注解的解析(注解控制器)及加载HttpMessageConverter
主要参考文章: SpringMVC关于json、xml自动转换的原理研究-附带源码分析 - format丶 - 博客园
对于注解的解析:<mvc:annotation-driven/>
。该解析由类org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser
的parse()
方法处理。
- 源码路径:AnnotationDrivenBeanDefinitionParser类→parse()方法→getMessageConverters()方法。
- 源码中可知,如果没有配置
<mvc:message-converters>
属性,则加载默认的HttpMessageConverter。- 默认的有4个基础的,和5个需要条件再加载的。(这部分不做说明,不属于本文内容)
- 如果配置了,则只加载配置的HttpMessageConverter
- 源码中可知,如果没有配置
如同上述配置,则只会加载两个sourceHttpMessageConverter
和fastJsonHttpMessageConverter
。
4.2 HttpMessageConverter的supportedMediaTypes属性作用
我们配置了多个HttpMessageConverter,而每个HttpMessageConverter可以处理哪些类型的请求则由supportedMediaTypes属性定义(不止该属性,但也是一部分)
这部分的具体使用在:
- 读部分参考【3.2.1】,找到canRead方法的调用地方之后,我们看canRead方法的实现。
- 以FastJsonHttpMessageConverter为例,它的canRead方法实现实际调用的时父类(AbstractHttpMessageConverter)的canRead方法实现
- 父类的实现如下,可以看到有对
supportedMediaType
的过滤
- 父类的实现如下,可以看到有对
- 以FastJsonHttpMessageConverter为例,它的canRead方法实现实际调用的时父类(AbstractHttpMessageConverter)的canRead方法实现
至此,我们可以确定,XML的配置中的supportedMediaTypes会音响该消息转换器可以处理的请求。以上述配置为例,sourceHttpMessageConverter负责处理XML数据格式的请求;fastJsonHttpMessageConverter处理json格式的请求。
canWrite方法也会用到supportedMediaTypes,可以自行梳理。至此,消息转换器的配置以及生效过程就比较清晰了。
5、参考:
- SpringMVC 源码剖析(五)- 消息转换器 HttpMessageConverter - 相见欢的个人空间 - OSCHINA
注:本篇博客就是该文章的翻版,所以原文很重要。- SpringMVC关于json、xml自动转换的原理研究-附带源码分析 - format丶 - 博客园
注:对配置的生效过程说明很详细,可以参考。- 스프링 MVC 해석 - -하지 걱정, 패자 -
OSCHINA. 참고 : 봄 XML 구성 구문 분석 설명은 매우 분명하다하십시오. 키 : 레이블을 완료하는 서브 클래스 BeanDefinitionParser 인터페이스에 의해 해결됩니다. AnnotationDrivenBeanDefinitionParser에 대한 상세한 분석이있다.- springMVC 메시지 변환 (메시지 변환기) - 제인 도서
참고 : 큰, 소스 코드는 사용자 지정 메시지 컨버터 설명 좋은 설명입니다.- SpringMVC HttpMessageConverter 규칙을 일치 - - SegmentFault시 없음
참고 : 일치 규칙은 매우 깊은 의미, 후속 모습을 읽을 수 없습니다.