Jackson 전면 분석 - SpringBoot 통합 Jackson 2 (HttpMessageConverter)

5249 단어
이전 장 에 서 는 sb 에서 Jackson 에 대해 어떻게 입자 도 를 설정 하 는 지 설명 하 였 습 니 다. 그러면 sb 는 프레임 에 Jackson 을 어떻게 삽입 하 는 지, @ Response Body 주석 type 또는 method 에 대해 sb 는 RequestResponse Body MethodProcessor 류 를 사용 하여 처리 합 니 다.그 중의 handle ReturnValue 방법 은 방법 을 되 돌려 주 는 대상 을 우리 가 필요 로 하 는 유형 으로 변환 합 니 다. json 이나 xml 보다 못 합 니 다.
@Override
                                                          //    
    public void handleReturnValue(@Nullable Object returnValue , 
                                                        //     
                                                        MethodParameter returnType,
                                                        //spring modeView  
                                           ModelAndViewContainer 
 //     request
 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);
    }


핵심 적 인 방법 은 마지막 writeWith MessageConverters (returnValue, returnType, input Message, outputMessage) 입 니 다.
그럼 이 HttpMessage Converter 들 은 어떻게 sb 에 등록 되 었 습 니까? configure 의 설정 일 것 입 니 다. sb 에서 여러 곳 의 configure 를 제공 하여 HttpMessage Converter 를 등록 하 였 습 니 다.하 나 는 HttpMessage Converters AutoConfiguration 입 니 다. 설정 변경 파일 에 StringHttpMessage Converter 를 등록 한 bean 입 니 다. import 때 문 입 니 다.
@Import({ JacksonHttpMessageConvertersConfiguration.class,
        GsonHttpMessageConvertersConfiguration.class,
        JsonbHttpMessageConvertersConfiguration.class })

제 classpath 는 jackson 이 있 기 때문에 Jackson HttpMessage Converters Configuration 을 따라 갔 습 니 다. 그 중에서 Mapping Jackson 2HttpMessage Converter 의 bean 을 등 록 했 습 니 다.
HttpMessageConverters bean 을 생 성 할 때 WebMvcConfigurationSupport 류 의 addDefaultHttpMessageConverters 방법 을 호출 합 니 다. 이 안에 기본 으로 사용 되 는 메시지 변환 기 를 계속 등록 합 니 다.아래 와 같다
protected final void addDefaultHttpMessageConverters(List> messageConverters) {
        StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
        stringHttpMessageConverter.setWriteAcceptCharset(false);  // see SPR-7316

        messageConverters.add(new ByteArrayHttpMessageConverter());
        messageConverters.add(stringHttpMessageConverter);
        messageConverters.add(new ResourceHttpMessageConverter());
        messageConverters.add(new ResourceRegionHttpMessageConverter());
        try {
            messageConverters.add(new SourceHttpMessageConverter<>());
        }
        catch (Throwable ex) {
            // Ignore when no TransformerFactory implementation is available...
        }
        messageConverters.add(new AllEncompassingFormHttpMessageConverter());

        if (romePresent) {
            messageConverters.add(new AtomFeedHttpMessageConverter());
            messageConverters.add(new RssChannelHttpMessageConverter());
        }

        if (jackson2XmlPresent) {
            Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.xml();
            if (this.applicationContext != null) {
                builder.applicationContext(this.applicationContext);
            }
            messageConverters.add(new MappingJackson2XmlHttpMessageConverter(builder.build()));
        }
        else if (jaxb2Present) {
            messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
        }

        if (jackson2Present) {
            Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.json();
            if (this.applicationContext != null) {
                builder.applicationContext(this.applicationContext);
            }
            messageConverters.add(new MappingJackson2HttpMessageConverter(builder.build()));
        }
        else if (gsonPresent) {
            messageConverters.add(new GsonHttpMessageConverter());
        }
        else if (jsonbPresent) {
            messageConverters.add(new JsonbHttpMessageConverter());
        }

        if (jackson2SmilePresent) {
            Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.smile();
            if (this.applicationContext != null) {
                builder.applicationContext(this.applicationContext);
            }
            messageConverters.add(new MappingJackson2SmileHttpMessageConverter(builder.build()));
        }
        if (jackson2CborPresent) {
            Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.cbor();
            if (this.applicationContext != null) {
                builder.applicationContext(this.applicationContext);
            }
            messageConverters.add(new MappingJackson2CborHttpMessageConverter(builder.build()));
        }
    }

이러한 방식 을 통 해 sb 는 시작 에 성공 한 후에 용기 안에 이러한 기본 메시지 변환기 가 있 습 니 다. 물론 우 리 는 메시지 변환 기 를 사용자 정의 한 다음 에 등록 할 수 있 고 사용자 정의 논 리 를 실현 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기