Веб-клиент + Джексон: как настроить десериализацию для преобразования змеиного случая в верблюжий случай?

Я хотел бы избежать необходимости ставить перед моими атрибутами префикс @JsonProperty("property_name") и вместо этого просто настроить сборщик Spring WebClient для преобразования всех змеиных случаев в верблюжьи случаи.

Это возможно?


person bpereira    schedule 30.12.2019    source источник
comment
@MichałZiober Извините, я был в отпуске. Я только что проверил ваше решение, и оно работает!   -  person bpereira    schedule 05.01.2020


Ответы (3)


Прочтите 9.4.3 . Настройте Jackson ObjectMapper и 10. .А.4. Свойства JSON, чтобы знать, сколько опций мы можем определить из файла конфигурации. В вашем случае нужно установить:

spring.jackson.property-naming-strategy=SNAKE_CASE

Если вы хотите изменить конфигурацию только для десериализации, вам нужно настроить способ создания WebClient.

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.codec.json.Jackson2JsonDecoder;
import org.springframework.web.reactive.function.client.ExchangeStrategies;
import org.springframework.web.reactive.function.client.WebClient;

@Configuration
public class WebClientConfiguration {

    @Bean
    public WebClient webClient(ObjectMapper baseConfig) {
        ObjectMapper newMapper = baseConfig.copy();
        newMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

        ExchangeStrategies exchangeStrategies = ExchangeStrategies.builder()
                .codecs(configurer ->
                        configurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder(newMapper)))
                .build();
        return WebClient.builder()
                .baseUrl("http://localhost:8080")
                .exchangeStrategies(exchangeStrategies)
                .build();
    }
}

Видеть:

person Michał Ziober    schedule 30.12.2019

Вы можете добавить аннотацию к вашему классу модели:

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class Model {
  String camelCase; //will be camel_case in json
}
person donquih0te    schedule 30.12.2019
comment
JsonNaming предназначен только для сериализации, я не хочу, чтобы мои ответы были змеиными, я хочу иметь возможность читать другие API-интерфейсы, которые являются змеиными, и преобразовывать их в верблюжий случай (только десериализация, а не сериализация) - person bpereira; 30.12.2019

Вы можете либо последовать этому совету и применить конфигурацию только для одной модели.

Или вы можете настроить его глобально через соответствующее свойство:

spring:
  jackson:
    property-naming-strategy: SNAKE_CASE
person Stepan Tsybulski    schedule 30.12.2019
comment
Но если я настрою его глобально, это означает, что мой API также будет отвечать змеей_case, верно? Я не хочу менять сериализацию, только десериализацию. - person bpereira; 30.12.2019
comment
Согласитесь, тогда это хороший вопрос. Мое решение влияет на оба. - person Stepan Tsybulski; 30.12.2019