java-8 - 对象列表的反序列化不适用于 Rest Assured Jsonpath 和 jdk8

标签 java-8 rest-assured jackson-databind rest-assured-jsonpath

我有一个返回以下响应的休息端点

{
  "incentives": [
    {
      "incentiveId": "271230",
      "effectiveDate": "2022-06-01T07:00:00.000+0000",
      "expiryDate": "2022-10-01T03:00:00.000+0000",
      "incentiveName": "$500 MAZDA LOYALTY REWARD PROGRAM",
      "incentiveAmount": 500,
      "incentiveType": "discount",
      "disclaimer": ""
    },
    {
      "incentiveId": "271231",
      "effectiveDate": "2022-06-01T07:00:00.000+0000",
      "expiryDate": "2022-10-01T03:00:00.000+0000",
      "incentiveName": "$500 MAZDA MILITARY APPRECIATION BONUS CASH",
      "incentiveAmount": 500,
      "incentiveType": "discount",
      "disclaimer": ""
    },
    {
      "incentiveId": "271229",
      "effectiveDate": "2022-06-01T07:00:00.000+0000",
      "expiryDate": "2022-07-01T03:00:00.000+0000",
      "incentiveName": "MAZDA MOBILITY PROGRAM CASH BONUS",
      "incentiveAmount": 1000,
      "incentiveType": "discount",
      "disclaimer": "Program Period is 6/1/2022 - 6/30/2022."
    },
    {
      "incentiveId": "271242",
      "effectiveDate": "2022-06-01T07:00:00.000+0000",
      "expiryDate": "2022-07-06T06:59:00.000+0000",
      "incentiveName": "$500 MAZDA LEASE TO LEASE LOYALTY REWARD PROGRAM",
      "incentiveAmount": 500,
      "incentiveType": "discount",
      "disclaimer": ""
    }
  ]
}

我正在使用 Rest Assured Jsonpath 使用以下代码行反序列化激励列表

JsonPath jsonPathEvaluator = response.jsonPath();
List<Incentive> incentivesList = jsonPathEvaluator.getList("incentives", Incentive.class);

但是上面的代码行抛出以下异常

java.util.ServiceConfigurationError: com.fasterxml.jackson.databind.Module: Provider com.fasterxml.jackson.datatype.jdk8.Jdk8Module not found
    at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:593)
    at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(ServiceLoader.java:1219)
    at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1228)
    at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1273)
    at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1309)
    at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1393)
    at com.fasterxml.jackson.databind.ObjectMapper.findModules(ObjectMapper.java:929)
    at com.fasterxml.jackson.databind.ObjectMapper.findModules(ObjectMapper.java:912)
    at com.fasterxml.jackson.databind.ObjectMapper.findAndRegisterModules(ObjectMapper.java:948)
    at io.restassured.path.json.mapper.factory.DefaultJackson2ObjectMapperFactory.create(DefaultJackson2ObjectMapperFactory.java:29)
    at io.restassured.path.json.mapper.factory.DefaultJackson2ObjectMapperFactory.create(DefaultJackson2ObjectMapperFactory.java:27)
    at io.restassured.common.mapper.factory.ObjectMapperFactory$create.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:148)
    at io.restassured.internal.path.json.mapping.JsonPathJackson2ObjectDeserializer.createJackson2ObjectMapper(JsonPathJackson2ObjectDeserializer.groovy:37)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.codehaus.groovy.runtime.callsite.PlainObjectMetaMethodSite.doInvoke(PlainObjectMetaMethodSite.java:43)
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:193)
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:61)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:171)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:194)
    at io.restassured.internal.path.json.mapping.JsonPathJackson2ObjectDeserializer.deserialize(JsonPathJackson2ObjectDeserializer.groovy:44)
    at io.restassured.path.json.mapping.JsonPathObjectDeserializer$deserialize.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
    at io.restassured.internal.path.json.mapping.JsonObjectDeserializer.deserializeWithJackson2(JsonObjectDeserializer.groovy:109)
    at io.restassured.internal.path.json.mapping.JsonObjectDeserializer$deserializeWithJackson2.callStatic(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:55)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:217)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:240)
    at io.restassured.internal.path.json.mapping.JsonObjectDeserializer.deserialize(JsonObjectDeserializer.groovy:70)
    at io.restassured.path.json.JsonPath.jsonStringToObject(JsonPath.java:1093)
    at io.restassured.path.json.JsonPath.getList(JsonPath.java:400)

下面是我的 pom.xml 文件中的依赖项

<!-- https://mvnrepository.com/artifact/io.rest-assured/rest-assured -->
<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>rest-assured</artifactId>
    <version>5.1.0</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
    <version>2.6.3</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.6.0</version>
</dependency>

下面是我机器上的java版本

java version "1.8.0_333"
Java(TM) SE Runtime Environment (build 1.8.0_333-b02)
Java HotSpot(TM) Client VM (build 25.333-b02, mixed mode, sharing)

您能否帮助我了解问题所在以及如何解决此问题?

最佳答案

通过在 pom.xml 文件中添加以下依赖项解决了我的问题,我使用的是 Java 11 版本。以下依赖项用于支持 JDK8 数据类型。

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jdk8 -->
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
    <version>2.13.3</version>
</dependency>

关于java-8 - 对象列表的反序列化不适用于 Rest Assured Jsonpath 和 jdk8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72564351/

相关文章:

java - 如何在 collect 的 java 流中将 Map<String, Person> 转换为 Map<String, Integer>?

java - 使用 Jackson ObjectMapper 反序列化或序列化任何类型的对象并处理异常

java - jackson 抛出 JsonMappingException 无法构造实例

spring-boot - 类 com.fasterxml.jackson.dataformat.xml.XmlMapper 正在从多个位置加载

java - 新的 javadoc 注释 @apiNote

Java泛型接口(interface)实现不能省略类型参数?

java - 使用方法引用将 List 类型 <Integer> 转换为 String[] 数组

java - 请放心解析消息时出错 : "Invalid UTF-8 middle byte 0x20"

java - 请放心 : Getting org. apache.http.ConnectionClosedException:Content-Length 分隔的消息正文过早结束

java - 请放心收到 SSL 错误