如何实现Java 8 LocalTimeDeserializer?

如何解决如何实现Java 8 LocalTimeDeserializer?

我一直在寻找使用Jackson API的LocalTimeDeserializer类实现自定义解串器的方法

但是,在使用此类实际反序列化属性时,我遇到了错误

com.fasterxml.jackson.databind.JsonMappingException:com.dspim.api.common.LocalTimeWithStringDeserializer类没有认(无arg)构造函数

我正在使用以下自定义实现在bean类内部反序列化。

@JsonProperty @JsonDeserializer(using = LocalTimeWithStringDeserializer.class) 私有LocalTime包装时间//它将保留时间值,即13:24(01:24 PM)。

我实现了反序列化器类,如下所示。

package com.testapp.test;

import java.io.IOException;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;

public class LocalTimeWithStringDeserializer extends com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer{
    
    public LocalTimeWithStringDeserializer(DateTimeFormatter formatter) {
        super(formatter);
    }

    private static final long serialVersionUID = 1L;
    
    @Override
    public LocalTime deserialize(JsonParser jp,DeserializationContext ctxt) throws IOException,JsonProcessingException {
        
        return LocalTime.parse(jp.getText());
    }

}

父类中的认构造函数(不带参数)是私有的,因此当我遇到编译时错误时,无法向我的类实现中添加认构造函数(不带参数)。

请为该问题提出解决方案。

请注意:我有一个客户端的两个不同项目(彼此依赖已添加到类路径中),由于依赖版本冲突,在其中我无法使用内置的Jackson解串器,这就是为什么我不得不使用自定义解串器。

解决方法

如果父类具有私有的无参数构造函数,那么这并不禁止您自己拥有无参数的构造函数:

public class LocalTimeWithStringDeserializer extends com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer{

    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");

    public LocalTimeWithStringDeserializer() {
        super(formatter);
    }

    // ...
}
,

也许您不需要自己的解串器。您需要做的就是用以下注释对LocalTime成员进行注释:

static class Entity {
    LocalTime time;

    @JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "HH:mm:ss")
    public LocalTime getTime() {
        return time;
    }
}

这应该有效。请参阅以下问题的答案:Spring Data JPA - ZonedDateTime format for json serialization

,

我在我的项目中使用 LocalTime 反序列化器并将其链接到 JSOG/JSON 以在 API 层被调用时进行反序列化。我在要反序列化的字段上方的模型层中使用注释声明它。我使用 jackson.databind.JsonDeserializer,它对我很有效。

这是我使用的代码:

import java.io.IOException;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

public class CustomJacksonLocalTimeDeserializer extends JsonDeserializer<LocalTime> {

    @Override
    public LocalTime deserialize(JsonParser jsonparser,DeserializationContext context)
            throws IOException,JsonProcessingException {
        String dateAsString = jsonparser.getText();
        try {
            return LocalTime.parse(dateAsString,DateTimeFormatter.ISO_LOCAL_TIME);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

您还需要在字段上进行如下注释:

@JsonDeserialize(using = CustomJacksonLocalTimeDeserializer.class)
@JsonSerialize(using = CustomJacksonLocalTimeSerializer.class)
@Column(columnDefinition = "TIMESTAMP")
private LocalTime origHardScheduledTime;

我知道,您没有要求它,但为了完成起见,序列化程序看起来也很相似。

import java.io.IOException;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

public class CustomJacksonLocalTimeSerializer extends JsonSerializer<LocalTime> {
    
    @Override
    public void serialize(LocalTime date,JsonGenerator jsonGenerator,SerializerProvider serializers)
            throws IOException,JsonProcessingException {       
        jsonGenerator.writeString(date.format(DateTimeFormatter.ISO_LOCAL_TIME));
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?