[alibaba/fastjson]Java8LocalDateTime升级版本后序列化异常

2024-05-22 921 views
5
public static final Jdk8DateCodec      instance            = new Jdk8DateCodec();
private DateFormat                               dateFormat;
private String                                   dateFormatPattern;

SerializeConfig增加序列化配置时,直接调用instance,配置根本没有传递进去 image

Jdk8DateCodec初始化时直接调用无参构造,导致下方两个构建日期格式的属性没有被设置,请问怎么设置才能在Jdk8DateCodec实例化时增加日期格式? FastJsonConverter调用了FastJsonView的renderMergedOutputModel方法,里面调用了JSON的静态方法 image 但是JSON静态类里面创建serializer时只设置了setFastJsonConfigDateFormatPattern,但是Jdk8DateCodec是使用的dateFormat,知道Java8的time包比较复杂,但是这种不通用的设置实在是比较烦心 image

回答

0

没办法,没人处理,我先提供自己的实现,紧急处理一下 第一步:先自定义一个Jdk8DateCodec,集成CustomizeJdk8DateCodec,重写write方法就行了,只需要一点点修改 serializer.setDateFormat("yyyy-MM-dd HH:mm:ss");

public class CustomizeJdk8DateCodec extends Jdk8DateCodec {

    public static final CustomizeJdk8DateCodec instance = new CustomizeJdk8DateCodec();

    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        serializer.setDateFormat("yyyy-MM-dd HH:mm:ss");
        super.write(serializer, object, fieldName, fieldType, features);
    }
}

第二部 配置FastJsonHttpMessageConverter 时,覆盖SerializeConfig关于Java8时间处理的处理器

 public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(
            SerializerFeature.WriteMapNullValue,
            SerializerFeature.WriteNullListAsEmpty,
            SerializerFeature.DisableCircularReferenceDetect,
            SerializerFeature.PrettyFormat);
        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
        SerializeConfig serializeConfig = fastJsonConfig.getSerializeConfig();
        try {
            serializeConfig.put(Class.forName("java.time.LocalDateTime"), CustomizeJdk8DateCodec.instance);
            serializeConfig.put(Class.forName("java.time.LocalDate"),CustomizeJdk8DateCodec.instance);
        } catch (Exception e) {
            logger.error("非Java8以上版本!");
        }
        fastConverter.setFastJsonConfig(fastJsonConfig);
        return fastConverter;
    }

第三步:测试,通过....

7

这个问题紧急处理进入主干了吗,感觉没见相关的PR.

1

能提供重现问题的testcase么?