首页 > 解决方案 > 如何实现 Java 8 LocalTimeDeserializer?

问题描述

我一直在寻找使用杰克逊 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 反序列化器,这就是我被迫使用自定义反序列化器的原因。

标签: javajsonjacksonjava-timejsr310

解决方案


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

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

    // ...
}

推荐阅读