#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)