0

我一直在寻找使用杰克逊 API 的 LocalTimeDeserializer 类实现自定义反序列化器。

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

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

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

@JsonProperty @JsonDeserializer(using=LocalTimeWithStringDeserializer.class) private LocalTime packaging_time; //它将保持时间值,即 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 反序列化器,这就是我被迫使用自定义反序列化器的原因。

4

3 回答 3

3

如果父类有一个私有的无参数构造函数,那并不禁止你自己有一个无参数的构造函数:

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

    // ...
}
于 2020-11-02T19:47:36.760 回答
0

也许您不需要自己的反序列化器。您需要做的就是使用以下注释来注释您的 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

于 2020-11-03T12:10:16.497 回答
0

我在我的项目中使用 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));
    }
}
于 2021-06-03T13:42:03.087 回答