我已经在我的spring启动webapp中配置了一个FeignClient,在那里我调用一个返回以下对象的外部api。
public class Issue {
private Assignee assignee;
private Date createdAt;
private Date updatedAt;
private Date closedAt;
private String description;
private Date dueDate;
public Assignee getAssignee() {
return assignee;
}
public void setAssignee(Assignee assignee) {
this.assignee = assignee;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Date getDueDate() {
return dueDate;
}
public void setDueDate(Date dueDate) {
this.dueDate = dueDate;
}
public Date getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(Date updatedAt) {
this.updatedAt = updatedAt;
}
public Date getClosedAt() {
return closedAt;
}
public void setClosedAt(Date closedAt) {
this.closedAt = closedAt;
}
@Override
public String toString() {
return (JacksonJson.toJsonString(this));
}
}
字段updatedAt
、createdAt
和closedAt
均为蛇形。所有多字字段都显示为空。是否有任何方法配置FeignClient的Jackson解析器,使其可以处理蛇形字符?注意,我无法更改spring启动webapp的默认Jackson Parser,因为我自己以驼峰格式呈现json。我只需要在我用来连接到外部REST api的FeignClient上配置这个解析器。
我已经验证了从api调用返回的json响应在每个json字段中包含有效值。
为了解决这个问题,我使用了jackson-databind:2.11.4
库中的@JsonNaming
注释。在注释参数中,您需要定义json解析的属性命名策略。在我们的例子中,PropertyNamingStrategy.SnakeCaseStrategy.class
做到了这一点。命名策略仅针对注释下的实体更改,应用程序的其他地方不受影响。
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class Issue {...}
我是这样解决的。我创建了一个定制的JacksonParser作为Spring Bean。
@Configuration(proxyBeanMethods = false)
public class FeignClientDateFormatConfig {
@Bean
public Decoder feignDecoder() {
HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(customObjectMapper());
ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(jacksonConverter);
return new ResponseEntityDecoder(new SpringDecoder(objectFactory));
}
public ObjectMapper customObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return objectMapper;
}
}
此命令成功解析了蛇形的所有属性。
请注意,这有一个严重的限制。如果你有多个FeignClients
,其中只有一个返回蛇形json,那么你就不走运了。这将覆盖默认的FeignClient
配置。此解决方案的唯一可行的解决方案是将FeignClient
调用移动到单独的微服务中,以便其他FeignClient
调用不受影响。