Spring cloud open Притворяется, что не игнорирует нулевые значения при кодировании

#spring-boot #spring-cloud #spring-cloud-feign #openfeign

#spring-boot #spring-cloud #spring-cloud-притворяться #openfeign

Вопрос:

Я работаю над приложением Spring boot. Мы используем Spring cloud open Feign для выполнения вызовов rest. Мы используем GsonEncoder() по умолчанию, но по какой-то причине gson не исключает свойства null при кодировании полезной нагрузки.

Конфигурация:

  return Feign.builder()
                .options(ApiOptions())
                .encoder(new GsonEncoder())
                .decoder(new GsonDecoder())
                .target(ApiClient.class, "URL");
 

Клиент:

 @FunctionalInterface
@FeignClient(
        value = "apiTest",
        url = "urlHere"
)
public interface ApiClient {
    @PostMapping("path/to/service")
    AiResponse getDetails(ApiRequest apiRequest);
}
 

ApiRequest.java:

 public class ApiRequest {
    private String userName;
    private String userId;
    private String password;

    //@setters and getters
}
 

Но при выполнении запроса тело запроса :

 {
  "userName" : "test,
  "userId" : null,
  "password": "password"
}
 

Насколько я понимаю, Gson должен автоматически удалять значение null при сериализации тела запроса. Но я вижу, что в запросе существуют нулевые свойства.

Я даже пробовал с пользовательскими кодировщиками (Джексон снизу): https://github.com/OpenFeign/feign/blob/master/jackson/src/main/java/feign/jackson/JacksonEncoder.java

Как указано ниже, он не должен включать null при сериализации RequestBody , но все же я вижу, что в запросе передаются нулевые значения. https://github.com/OpenFeign/feign/blob/master/jackson/src/main/java/feign/jackson/JacksonEncoder.java#L39

Ниже приведены зависимости: Версия Spring clou: 2020.0.2 org.springframework.cloud: spring-cloud-starter-openfeign io.github.openfeign: feign-gson: 9.5.1

Любые предложения были бы действительно полезны. Заранее спасибо .!

Ответ №1:

Вам необходимо предоставить OpenFeign пользовательский кодировщик, чтобы он пропускал нули. В моем случае мне помогают эти компоненты.

 @Configuration
public class ExternalApiConfiguration {
    @Bean
    public Feign.Builder feignBuilder() {
        return Feign.builder()
                .contract(new SpringMvcContract());
    }

    @Bean("feignObjectMapper")
    public ObjectMapper feignObjectMapper() {
        final ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        return objectMapper;
    }

    @Bean
    public Encoder feignEncoder(@Qualifier("feignObjectMapper") ObjectMapper objectMapper) {
        HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(objectMapper);
        ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(jacksonConverter);
        return new SpringEncoder(objectFactory);
    }
 

И используйте эту конфигурацию, если FeignClient

 @FeignClient(configuration = ExternalApiConfiguration.class)