java - Jackson 和 Feign 无法反序列化 Spring 的 org.springframework.data.domain.Sort
问题描述
问题:一个 feign 客户端,对返回的 Spring Boot Rest API 进行 API 调用,该 APIPage<T>
无法反序列sort
化该页面的属性。
- Spring Boot:2.3.3.Release
- Spring Cloud Feign:2.2.5.RELEASE
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造实例
org.springframework.data.domain.Sort
(没有创建者,如默认构造函数,存在):无法从 [来源:(BufferedReader)的对象值(没有基于委托或基于属性的创建者)反序列化;行:1,列:238](通过引用链:org.springframework.cloud.openfeign.support.PageJacksonModule$SimplePageImpl["sort"])
不知道为什么注册PageJacksonModule
似乎不支持这一点。
给定一个手动配置的 Feign 客户端:
public class TelematicsConfig {
private String host;
ObjectMapper provideObjectMapper() {
return new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.setPropertyNamingStrategy(SnakeCaseStrategy.SNAKE_CASE)
.registerModule(new PageJacksonModule());
}
@Bean
TelematicsClient provideTelematicsClient() {
return Feign.builder()
.client(new OkHttpClient())
.encoder(new JacksonEncoder(provideObjectMapper()))
.decoder(new JacksonDecoder(provideObjectMapper()))
.logger(new Slf4jLogger(TelematicsClient.class))
.logLevel(Logger.Level.FULL)
.target(TelematicsClient.class, host);
}
}
客户本身:
public interface TelematicsClient {
@RequestLine("GET /api/v1/telematics/devices")
Page<TelematicsDevice> getDevices();
}
调用它时,我得到:
2020-09-16 12:38:49.707 ERROR 96244 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is feign.FeignException: Cannot construct instance of `org.springframework.data.domain.Sort` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (BufferedReader); line: 1, column: 238] (through reference chain: org.springframework.cloud.openfeign.support.PageJacksonModule$SimplePageImpl["sort"]) reading GET http://localhost:8081/api/v1/telematics/devices] with root cause
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.springframework.data.domain.Sort` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (BufferedReader); line: 1, column: 238] (through reference chain: org.springframework.cloud.openfeign.support.PageJacksonModule$SimplePageImpl["sort"])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1611)
at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1077)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1320)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:331)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:164)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:542)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:535)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:419)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1310)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:331)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:164)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4482)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3463)
at feign.jackson.JacksonDecoder.decode(JacksonDecoder.java:61)
任何关于为什么这不起作用的见解将不胜感激。
编辑:以下课程似乎暗示支持排序,不是吗?
解决方案
如果您使用自动配置的 Feign 客户端,您可以通过打开相应的配置属性来遵循Spring Cloud OpenFeign 文档:
您可以考虑启用 Jackson Modules 来支持
org.springframework.data.domain.Page
和org.springframework.data.domain.Sort
解码。feign.autoconfiguration.jackson.enabled=true
推荐阅读
- matlab - 在psychtoolbox matlab中将一个屏幕分成几个屏幕
- list - 给定一个字符串,获取元组列表(字符,字符连续出现多少次) - Haskell
- wordpress - 将自定义 wordpress 主题上传到网站而不是当前主题
- javascript - 在 javascript 中找不到非异步函数
- reactjs - 如何在 React 中将 JWT 发送到后端?
- visual-studio-code - 是否有 API 可以将项目添加到排水沟上下文菜单?
- c++ - с++ winforms.dataGridView。如何为表格单元格着色?
- c++ - C++ 使用向量对读取数据类型字符串 int 和 double
- assembly - div 如何使用定点算术在汇编语言中发挥作用?
- python - 你如何像循环一样重新运行两个python脚本