Автоматически настроенный Spring Boot Jackson ObjectMapper не используется для WebFlux WebClient по умолчанию - PullRequest
0 голосов
/ 21 февраля 2020

В моем приложении Spring Boot я использую реактивный WebFlux WebClient для извлечения потоковых JSON данных из конечной точки SSE (Server-Sent Events). Изменение автоматически настраиваемого поведения Jackson ObjectMapper по умолчанию путем установки параметров конфигурации в Spring Boot, например spring.jackson.deserialization.read-date-timestamps-as-nanoseconds=false, как предлагается в официальных документах , не влияет на WebFlux WebClient. Я также попробовал другие предложения, изложенные в этом SO thread , такие как создание пользовательских bean-компонентов для конфигурации WebFlux, но они не помогли, конфигурация по-прежнему не выбирается.

1 Ответ

0 голосов
/ 21 февраля 2020

Спустя некоторое время, потраченное на отладку кода библиотеки Spring WebFlux / Jackson, я наконец смог найти подсказку для решения проблемы, глядя на реактивный WebFlux WebClient docs . Для того чтобы WebClient использовал автоматически настраиваемый Jackson ObjectMapper по умолчанию, требуется некоторая пользовательская сантехника. Решение заключается в настройке декодера по умолчанию, используемого для обработки отправленных сервером событий при создании нового экземпляра WebClient. Вот пример кода:

@Component
public class MarketDataFetcher implements CommandLineRunner {

    // ...

    private final WebClient webClient;

    public MarketDataFetcher(ObjectMapper objectMapper) {
        webClient = createWebClient(objectMapper);
    }

    private WebClient createWebClient(ObjectMapper objectMapper) {
        return WebClient.builder()
                .codecs(configurer -> configurer.defaultCodecs()
                        .serverSentEventDecoder(new Jackson2JsonDecoder(objectMapper)))
                .baseUrl(BASE_URL)
                .build();
    }
}

ObjectMapper автоматически внедряется Spring, поэтому аннотация @Autowired не требуется.

Конечно, было бы полезно сделать это более явным в официальной документации как-то. Надеюсь, что этот ответ может быть полезен для тех, кто сталкивается с подобной проблемой!

...