Java 带着假罐头的杰克逊';t反序列化Spring';s org.springframework.data.domain.Sort

Java 带着假罐头的杰克逊';t反序列化Spring';s org.springframework.data.domain.Sort,java,spring-boot,spring-cloud-feign,feign,openfeign,Java,Spring Boot,Spring Cloud Feign,Feign,Openfeign,问题是:对返回页面的Spring boot Rest API进行API调用的外部客户端无法反序列化该页面的排序属性 弹簧靴:2.3.3.1释放 春云外挂:2.2.5.1发布 com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法 构造org.springframework.data.domain.Sort的实例 与默认构造函数一样,创建者(exist):无法从 对象值(无委托或基于属性的创建者),位于[源: (Buff

问题是:对返回
页面
的Spring boot Rest API进行API调用的外部客户端无法反序列化该页面的
排序
属性

  • 弹簧靴:2.3.3.1释放
  • 春云外挂:2.2.5.1发布
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法 构造
org.springframework.data.domain.Sort的实例
与默认构造函数一样,创建者(exist):无法从
对象值(无委托或基于属性的创建者),位于[源:
(BufferedReader);行:1,列:238](通过引用链:
org.springframework.cloud.openfeign.support.PageJacksonModule$SimplePageImpl[“排序”])

不确定为什么注册的
PageJacksonModule
似乎不支持这一点

给定手动配置的外部客户端:

公共级远程通信配置{
私有字符串主机;
ObjectMapper提供对象映射器(){
返回新的ObjectMapper()
.configure(针对未知属性的反序列化功能.FAIL,false)
.SetPropertyNamengStrategy(SnakeCaseStrategy.SNAKE_案例)
.registerModule(新页面JacksonModule());
}
@豆子
远程通信客户端提供远程通信客户端(){
return-Feign.builder()
.client(新的OkHttpClient())
.encoder(新的JacksonEncoder(提供对象映射器()))
.decoder(新的JacksonDecoder(提供对象映射器()))
.logger(新Slf4jLogger(远程通信客户端类))
.logLevel(Logger.Level.FULL)
.目标(远程信息处理客户端.class,主机);
}
}
客户本身:

公共接口远程通信客户端{
@请求行(“GET/api/v1/telematics/devices”)
Page 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)

如果您能深入了解为什么这不起作用,我们将不胜感激

编辑:下面的类似乎暗示支持排序,不是吗

找到了答案

返回新的ObjectMapper()
.configure(针对未知属性的反序列化功能.FAIL,false)
.SetPropertyNamengStrategy(SnakeCaseStrategy.SNAKE_案例)
.registerModule(新页面JacksonModule())

.registerModule(新的SortJacksonModule());// 如果使用自动配置的外部客户端,则可以通过打开相应的配置属性来执行以下操作:

您可以考虑启用Jackson模块来支持

org.springframework.data.domain.Page
org.springframework.data.domain.Sort
解码

feign.autoconfiguration.jackson.enabled=true

哦,太好了!我在文件里漏掉了这个。这似乎应该是默认设置,如果还没有的话。