如何实现Java8 LocalTimeDeserializer?

How to implement Java 8 LocalTimeDeserializer?

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

但是,在实际使用此 class.

反序列化属性时,我遇到了以下错误

com.fasterxml.jackson.databind.JsonMappingException: Class com.dspim.api.common.LocalTimeWithStringDeserializer has no default (no arg) constructor

我正在使用下面的自定义实现在 bean 中反序列化 class。

@JsonProperty @JsonDeserializer(using=LocalTimeWithStringDeserializer.class) private LocalTime packaging_time; //It will hold value for time i.e. 13:24 (01:24 PM).

我已经实现了解串器 class 如下。

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());
    }

}

父 class 中的默认构造函数(不带参数)是私有的,因此我无法将默认构造函数(不带参数)添加到我的 class 实现中,因为出现编译时错误.

请提出解决此问题的建议。

请注意: 我有两个不同的客户端项目(在 class 路径中添加了相互依赖),我无法在其中使用内置的由于依赖版本冲突,Jackson 反序列化器,这就是我被迫使用自定义反序列化器的原因。

如果父 class 有一个私有的 no-args 构造函数,这并不妨碍您自己拥有一个 no-args 构造函数:

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;
    }
}

这应该有效。查看此问题的答案:

我在我的项目中使用 LocalTime 反序列化器,link 它用于 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));
    }
}