봄 메시지 주석 컨버터와 컨트롤러

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.AnnotationDrivenBeanDefinitionParserparse()方法处理。

  • 源码路径:AnnotationDrivenBeanDefinitionParser类→parse()方法→getMessageConverters()方法。
    • 源码中可知,如果没有配置<mvc:message-converters>属性,则加载默认的HttpMessageConverter。
      • 默认的有4个基础的,和5个需要条件再加载的。(这部分不做说明,不属于本文内容)
    • 如果配置了,则只加载配置的HttpMessageConverter

如同上述配置,则只会加载两个sourceHttpMessageConverterfastJsonHttpMessageConverter

4.2 HttpMessageConverter的supportedMediaTypes属性作用

我们配置了多个HttpMessageConverter,而每个HttpMessageConverter可以处理哪些类型的请求则由supportedMediaTypes属性定义(不止该属性,但也是一部分)
这部分的具体使用在:

  • 读部分参考【3.2.1】,找到canRead方法的调用地方之后,我们看canRead方法的实现。
    • 以FastJsonHttpMessageConverter为例,它的canRead方法实现实际调用的时父类(AbstractHttpMessageConverter)的canRead方法实现
      • 父类的实现如下,可以看到有对supportedMediaType的过滤

至此,我们可以确定,XML的配置中的supportedMediaTypes会音响该消息转换器可以处理的请求。以上述配置为例,sourceHttpMessageConverter负责处理XML数据格式的请求;fastJsonHttpMessageConverter处理json格式的请求。

canWrite方法也会用到supportedMediaTypes,可以自行梳理。至此,消息转换器的配置以及生效过程就比较清晰了。

5、参考:

  1. SpringMVC 源码剖析(五)- 消息转换器 HttpMessageConverter - 相见欢的个人空间 - OSCHINA
    注:本篇博客就是该文章的翻版,所以原文很重要。
  2. SpringMVC关于json、xml自动转换的原理研究-附带源码分析 - format丶 - 博客园
    注:对配置的生效过程说明很详细,可以参考。
  3. 스프링 MVC 해석 - -하지 걱정, 패자 -
    OSCHINA. 참고 : 봄 XML 구성 구문 분석 설명은 매우 분명하다하십시오. 키 : 레이블을 완료하는 서브 클래스 BeanDefinitionParser 인터페이스에 의해 해결됩니다. AnnotationDrivenBeanDefinitionParser에 대한 상세한 분석이있다.
  4. springMVC 메시지 변환 (메시지 변환기) - 제인 도서
    참고 : 큰, 소스 코드는 사용자 지정 메시지 컨버터 설명 좋은 설명입니다.
  5. SpringMVC HttpMessageConverter 규칙을 일치 - - SegmentFault시 없음
    참고 : 일치 규칙은 매우 깊은 의미, 후속 모습을 읽을 수 없습니다.

추천

출처www.cnblogs.com/buwuliao/p/11859103.html