我们最近将jackson-databind从3.11.4版本迁移到3.12.13.2版本,see框架从5.2.19版本迁移到5.2.22.RELEASE。
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8默认不支持的日期/时间类型java.time.Instant:添加模块"com.fasterxml.jackson.datatype:jackson-datatype-jsr310“以启用处理(
要解决这个问题,我在下面添加了代码
mapper =新的ObjectMapper();
mapper.registerModule(new Jdk8Module());
mapper.registerModule(new JavaTimeModule());这解决了问题,但我现在看到对话错误即时类型对话。
预期为"myTime":{"epochSecond":1627413300,"nano":0}
但它的名字是"myTime":1.6274133E9
错误:原因是:期望一个对象,而不是获得键myTime的编号
使用旧版本的工作代码
pom依赖项-
杰克逊-数据库- 2.11.4杰克逊-数据类型-jsr310 310- 2.11.4
示例代码
public class ObjectMapperTest {
public static void main(String[] args) {
try{
ObjectMapper o = new ObjectMapper();
Message message = new Message();
System.out.println(message);
String s2= o.writeValueAsString(message);
System.out.println(s2);
JsonNode i3= o.readTree(s2);
System.out.println(i3);
} catch (Exception e) {
e.printStackTrace();
}
}
static class Message
{
private String source;
@JsonFormat(shape = JsonFormat.Shape.NUMBER, timezone = "UTC")
private Instant timestamp = Instant.now();
@Override
public String toString() {
return "Message [source=" + source + ", timestamp=" + timestamp + "]";
}
}}
输出
Message [source=null, timestamp=2022-05-06T12:28:49.004Z]
{"timestamp":{"epochSecond":1651840129,"nano":4000000}}
{"timestamp":{"epochSecond":1651840129,"nano":4000000}}版本升级后的示例代码
pom退步
杰克逊-数据库- 2.13.2.1杰克逊-数据类型-jsr310 310- 2.13.2
代码更改
只需将以下行添加到上面的代码中
ObjectMapper o = new ObjectMapper();
o.registerModule(new JavaTimeModule()); 输出
Message [source=null, timestamp=2022-05-06T12:28:49.004Z]
{"timestamp":1651839918.691000000}
{"timestamp":1.651839918691E9}预期输出
Message [source=null, timestamp=2022-05-06T12:28:49.004Z]
{"timestamp":{"epochSecond":1651840129,"nano":4000000}}
{"timestamp":{"epochSecond":1651840129,"nano":4000000}}发布于 2022-05-11 07:00:43
我能够通过创建自定义即时序列化程序并将其注册到JavaTimeModule来解决这个问题。
公共类EpochSecondInstantSerializer扩展JsonSerializer {
@Override
public Class<Instant> handledType() {
return Instant.class;
}
@Override
public void serialize(Instant instant, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeStartObject();
jsonGenerator.writeNumberField("epochSecond", instant.getEpochSecond());
jsonGenerator.writeNumberField("nano", instant.getNano());
jsonGenerator.writeEndObject();
}}
然后使用JavaTimeModule ObjectMapper mapper =新的ObjectMapper().registerModule(新JavaTimeModule().addSerializer(新EpochSecondInstantSerializer()注册;
https://stackoverflow.com/questions/72138076
复制相似问题