当前位置: 首页 > 知识库问答 >
问题:

Spring Boot-Jersey Client-Jackson无法构造`java.time.instant‘的实例

蒲寂离
2023-03-14

使用Jersey Client2.28,我试图接收一个包含以下数据的DTO:

{
    "entityId": "0de46a94-bc95-437f-9eca-dcfd60f7aed3",
    "productId": "9c328c45-deba-4b84-8fb4-0d2aea885fc0",
    "status": "ACTIVE",
    "startDatetime": "2020-05-12T08:54:23Z",
    "endDatetime": null,
}

当收到它时,我得到以下错误:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.Instant` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('2020-05-12T08:54:23Z')
 at [Source: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); line: 1, column: 190] (through reference chain: com.fundraiser.dto.OfferDto["startDatetime"])

我知道我应该能够在没有大量自定义序列化程序或适配器的情况下检索回此内容。在谷歌上,似乎还有其他密切相关的问题,但没有一个解决我的问题:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-moxy</artifactId>
  <version>2.28</version>
</dependency>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.0.RELEASE</version>
  </parent>

  <groupId>com.test</groupId>
  <artifactId>test-webapp</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>
  <name>test-webapp</name>
  <url>http://maven.apache.org</url>

  <dependencies>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.8</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.glassfish.jersey.core</groupId>
      <artifactId>jersey-client</artifactId>
      <version>2.28</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.jersey.inject</groupId>
      <artifactId>jersey-hk2</artifactId>
      <version>2.28</version>
    </dependency>
    <dependency>
      <groupId>com.test</groupId>
      <artifactId>test-client</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.3.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <version>2.3.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
      <version>2.3.0.RELEASE</version>
    </dependency>
  </dependencies>

  <properties>
    <java.version>11</java.version>
  </properties>

  <build>
    <finalName>test-webapp</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>11</source>
          <target>11</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
    <defaultGoal>install</defaultGoal>
  </build>
</project>

用于检索数据的代码:


 public TestClient() {
        this.client = ClientBuilder.newBuilder().register("application/json, */*").build();
    }

    private WebTarget webTarget() {
        return client
                .target(baseUri)
                .path("api")
                .path("v1");
    }

    private WebTarget entityTarget() {
        return webTarget()
                .path("entity");
    }

    public DataDto getEntityById(@NonNull UUID entityId) {
// Error occurs here
        return entityTarget()
                .path(entityId.toString())
                .request(MediaType.APPLICATION_JSON)
                .get(DataDto.class);
    }

更新:添加的Dto类:

package com.test.dto;

import lombok.Data;
import lombok.experimental.Accessors;

import java.time.Instant;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Data
@Accessors(chain = true)
public class DataDto {
    private UUID entityId;
    private UUID productId;
    private String status;
    private Instant startDatetime;
    private Instant endDatetime;
}

共有1个答案

郎项禹
2023-03-14

尝试注册Jackson config provider以序列化Jaxrs客户机中的jsr310对象,请查看此处。

目前,我还找不到一个完全符合您要求的例子,但是Jersey、rest easy和Apache CXF都有自己的客户端注册机制,您应该参考它们的详细文档。

更新:我刚刚更新了一个Spring/Jersey示例,演示如何解决这个问题,检查测试代码,注册一个自定义Jackson上下文解析器,使用Spring配置的JacksonObjectMapper处理Java8DateTime,然后可以使用IOS格式对Java8DateTime对象进行序列化/反序列化。

 类似资料:
  • 我正在使用Jackson,我遇到了问题,当我尝试反序列化一个对象时,我得到了以下错误: 我在属性上有问题: 有人能帮我吗?

  • //接口 我从这个问题中读到:不能构造-Jackson的实例,但似乎没有帮助,因为我有太多的类从接口实现,不仅仅是一次。

  • 问题内容: 我正在尝试从Oracle网站[fxml教程](http://docs.oracle.com/javase/8/javafx/get-started- tutorial/fxml_tutorial.htm )上的JavaFX教程。 这是我不断得到的例外。该应用程序未显示在屏幕上。我从另一个堆栈溢出答案中完成了非args Main()构造函数,但没有解决。 问题答案: 缺少初始关键字。 也

  • 问题内容: 我正在使用Jackson,但遇到问题,当我尝试反序列化对象时,出现以下错误: 我在属性中遇到问题: 有人可以帮我吗? 问题答案: 您不能实例化一个抽象类,杰克逊也不能。您应该为Jackson提供有关如何使用具体类型实例化MyAbstractClass的信息。

  • 我有一个以下类: 当我尝试转换JSON时 对于这个类实例,我得到以下异常: 获取原因:com . faster XML . Jackson . databind . jsonmappingexception:无法构造com . medianet . rtb . mogli . commons . dto . ad exchange . floor price data的实例:没有字符串参数构造函数

  • 我正在尝试从gson迁移到jackson。这很令人沮丧,jackson在序列化方面做得更好(gson会因为各种原因阻塞jackson序列化的类而没有抱怨)然而,gson更擅长反序列化。 无法构造组织的实例。javautil。果心csv。SqlCsvExporterJson(尽管至少存在一个创建者):没有从字符串值反序列化的字符串参数构造函数/工厂方法。 我已经将其简化为一个简单的bean,我将其序