在远程调用feignclient接口后,返回的响应对象中空字符串被转换成了null
问题:CommonResponse<DummyPage<PoiNode>> ret = openApiClient.search(...);调用远程服务后,ret中原本为空字符串""的对象属性被设置成了null,导致后续保存/更新数据库非空字段执行异常
@RestController
@RequestMapping("/sysApi/poi")
public class PoiApi {
@Autowired
PoiOpenApiClient openApiClient;
CommonResponse<DummyPage<PoiNode>> ret = openApiClient.search(new Query(pageNum - 1, pageSize, poiSearchDto));
DummyPage<PoiNode> content = ret.getData();
return CommonResponse.success(content);
}
import org.springframework.cloud.openfeign.FeignClient;
@FeignClient(name = "ex-service", url = "${url.ex-service}")
public interface PoiOpenApiClient extends PoiApi {
}
解决方式:
1.添加feignclient配置文件;2.在@FeignClient中设置configuration自定义配置值;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@Configuration
public class CustomFeignClientMapperConfig {
@Bean
public ObjectMapper customObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>(){
@Override
public void serialize(Object value, JsonGenerator paramJsonGenerator, SerializerProvider provider) throws IOException {
String fieldName = paramJsonGenerator.getOutputContext().getCurrentName();
try {
Field field = paramJsonGenerator.getCurrentValue().getClass().getDeclaredField(fieldName);
if(Objects.equals(field.getType(), String.class)) {
paramJsonGenerator.writeString("");
} else if (Objects.equals(field.getType(), List.class)) {
paramJsonGenerator.writeStartArray();
paramJsonGenerator.writeEndArray();
} else if (Objects.equals(field.getType(), Map.class)) {
paramJsonGenerator.writeStartObject();
paramJsonGenerator.writeEndObject();
} else {
paramJsonGenerator.writeNull();
}
} catch (Exception e) {
paramJsonGenerator.writeNull();
}
}
});
return objectMapper;
}
}
import org.springframework.cloud.openfeign.FeignClient;
@FeignClient(name = "ex-service", url = "${url.ex-service}", configuration = CustomFeignClientMapperConfig.class)
public interface PoiOpenApiClient extends PoiApi {
}