Использование того же ObjectMapper RestTemplate для автономного ObjectMapper

Вот такая у меня установка:

RestTemplate с пользовательскими MessageConverter ObjectMapper, который имеет некоторые функции десериализации и обработчики проблем (Jackson Fasterxml 2.8.9). У RestTemplate также есть пользовательский ResponseErrorHandler.

Во время вызова REST с RestTemplate, если статус ответа должен обрабатываться ResponseErrorHandler, мне, возможно, придется проанализировать тело потока и сопоставить его с объектом.

Мне было интересно, если я смогу сделать свой ObjectMapper компонентом (@Bean/@Qualifer), смогу ли я использовать этот одноэлементный компонент как в ObjectMapper RestTemplate, так и внедрить его как зависимость в тот же RestTemplate ResponseErrorHandler? Будет ли это безопасно?

Причина, по которой я хочу сделать это, заключается в том, что все функции десериализации и обработчики проблем должны быть идентичными, когда дело доходит до привязки данных — происходит ли это внутри механизма извлечения данных RestTemplate или когда тело ответа необходимо отобразить во время ResponseErrorHandler#handlerError().


person NuCradle    schedule 11.09.2019    source источник
comment
Возможный дубликат В чем преимущество объявления ObjectMapper как фасоль?   -  person Mạnh Quyết Nguyễn    schedule 11.09.2019
comment
Контекст этого вопроса иной. Нужно перебрать все MessageConverter, которые предоставляет RestTemplate, чтобы найти подходящий и получить его ObjectMapper. Когда RestTemplate извлекает данные, внутри он использует этот ObjectMapper, поэтому я не уверен, в каком состоянии он находится, если он снова используется внутри того же пользовательского ResponseErrorHandler RestTemplate до того, как будут возвращены RestTemplate.   -  person NuCradle    schedule 11.09.2019


Ответы (1)


Определите преобразователь объектов и bean-компонент RestTemplate.

Или вручную RestTemplate каждый раз при его создании.

Не забудьте добавить конвертер первым в списке.

@Bean
public RestTemplate restTemplate() {
    RestTemplate rest = new RestTemplate();
    // Add the object mapper as first instance in list for eager discovery
    rest.getMessageConverters().add(0, jacksonConverter());
    return rest;
}

@Bean
public HttpMessageConverter jacksonConverter() {
    MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
    converter.setObjectMapper(objectMapper());
    return converter;
}

@Bean
public ObjectMapper objectMapper() {
    return new ObjectMapper();
}
person Mạnh Quyết Nguyễn    schedule 11.09.2019
comment
Да, вопрос заключался в том, могу ли я безопасно использовать этот @Bean ObjectMapper внутри моего пользовательского RestTemplate ResponseErrorHandler для десериализации из потока, даже если это будет тот же объект bean-компонента, который RestTemplate использует для извлечения данных (см. RestTemplate код здесь -- обратите внимание также на строку 691) - person NuCradle; 11.09.2019