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

Spring Boot无法反序列化包含OffsetDateTime的对象

黎玺
2023-03-14

我试图调用一个restendpoint,它返回一个pojo对象,如下所示:

public class Process   {
  @JsonProperty("id")
  private String id = null;

  @JsonProperty("processDefinitionId")
  private String processDefinitionId = null;

  @JsonProperty("businessKey")
  private String businessKey = null;

  @JsonProperty("startedAt")
  private OffsetDateTime startedAt = null;

  @JsonProperty("endedAt")
  private OffsetDateTime endedAt = null;

  @JsonProperty("durationInMs")
  private Integer durationInMs = null;

  @JsonProperty("startActivityDefinitionId")
  private String startActivityDefinitionId = null;

  @JsonProperty("endActivityDefinitionId")
  private String endActivityDefinitionId = null;

  @JsonProperty("startUserId")
  private String startUserId = null;

  @JsonProperty("deleteReason")
  private String deleteReason = null;

  //constructors and setters+getters
}

以下是电话:

ResponseEntity<Process> responseModel = restTemplate.exchange("http://localhost:8062/processes", HttpMethod.POST, httpEntity, Process.class);

问题是我已经尝试了一些方法,例如忽略 OffsetDateTime 属性或尝试更改该日期的格式,但它会引发此错误:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.threeten.bp.OffsetDateTime` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('2019-10-04T13:20:29.315Z')

否则它将返回空:(解决这个问题的好解决方案是什么?

共有2个答案

锺玺
2023-03-14

我在使用swagger生成的bean时遇到了同样的问题。为了解决这个问题,我为日期类型创建了一些序列化器和反序列化器:org.threeten.bp.LocalDate和org.threeten.bp.offsetDateTime。它工作得很好:)。

@Bean
@Primary
public ObjectMapper serializingObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    JavaTimeModule javaTimeModule = new JavaTimeModule();
    javaTimeModule.addSerializer(OffsetDateTime.class, new OffsetDateTimeSerializer());
    javaTimeModule.addDeserializer(OffsetDateTime.class, new OffsetDateTimeDeserializer());
    javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer());
    javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer());
    objectMapper.registerModule(javaTimeModule);
    return objectMapper;
}

public static class OffsetDateTimeSerializer extends JsonSerializer<OffsetDateTime> {
    @Override
    public void serialize(OffsetDateTime arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException {
        arg1.writeString(arg0.toString());
    }
}

public static class OffsetDateTimeDeserializer extends JsonDeserializer<OffsetDateTime> {
    @Override
    public OffsetDateTime deserialize(JsonParser arg0, DeserializationContext arg1) throws IOException {
        return OffsetDateTime.parse(arg0.getText());
    }
}

public static class LocalDateSerializer extends JsonSerializer<LocalDate> {
    @Override
    public void serialize(LocalDate arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException {
        arg1.writeString(arg0.toString());
    }
}

public static class LocalDateDeserializer extends JsonDeserializer<LocalDate> {
    @Override
    public LocalDate deserialize(JsonParser arg0, DeserializationContext arg1) throws IOException {
        return LocalDate.parse(arg0.getText());
    }
}
姜嘉荣
2023-03-14

错误声明它无法构造org.threeten.bp.OffsetDateTime的实例。你需要使用

java.time.offsetdatetime

然后在您的模型中,您可以按照自己喜欢的任何方式对其进行格式化,例如

@JsonProperty("endedAt") //this line is not needed when it is the same as the instance variable name
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd@HH:mm:ss.SSSZ")
private OffsetDateTime endedAt;
 类似资料:
  • (数据类)实体。JAVA (数据类)实体。JAVA 我试着说: 我犯了一个错误: 我已经把和我错过了什么?

  • 问题内容: 顾名思义,我正在尝试将包含一些BufferedImages(包括其他变量,字符串等)的对象保存到文件中。 我发现了这一点: 如何序列化包含BufferedImages的对象 它的工作原理就像一种魅力,但有一点点挫折:如果您的对象仅包含一个图像,它就可以很好地工作。 我一直在努力获取他的解决方案以处理多个图像(理论上应该可以使用),但是每次读入文件时,我都会得到对象,图像数量正确,但只有

  • 问题内容: 你好(对不起我的英语) 我正在开发使用Spring SPRING MVC的json前端网站消耗Web服务的Web服务。spring mvc使用JsonIdentityInfo选项进行序列化,因此每个对象仅在json中写入一次,并且每次都使用引用进行写入,例如她使用相同的对象“ component”有2个“ computer”,因此spring将ID设置为第一个组件(“ @compone

  • 问题内容: 使用取消序列化对象时出现以下错误: JSONMappingException无法构造org.springframework.data.Page的实例,问题:抽象类型只能用其他类型信息实例化。 我正在尝试将JSON字符串序列化为表示类型页面的Spring数据对象T。 该User班是一个简单的与和名称。我要反序列化的字符串是: 这将导致异常: 由于是对象,因此无法修改它,我认为这与我在别处

  • 然后是班级选拔: 教材: 因此,我主要创建新用户并将其序列化: 一切都很完美,但如果我这样做: 然后我想序列化对象用户,程序崩溃了。我得到的结果是: JAVA木卫一。NotSerializableException:在java上。木卫一。ObjectOutputStream。java上的WriteObject 0(ObjectOutputStream.java:1183)。木卫一。ObjectOu

  • 问题内容: 我试图序列化和反序列化内部对象的数组列表: HairList对象也是一个可序列化的对象。 此代码执行返回以下错误: 排队 我不知道我在做什么错。你能给个小费吗? 更新: 解决: 仅使用HairBirt的本机数组而不是ArrayList即可工作: 代替 感谢大家的帮助。 问题答案: 不要使用-而是使用二进制数据并对它进行base64编码,以将其转换为字符串而不会丢失信息。 我强烈怀疑这是