@ JsonFormat不适用于自定义序列化程序

问题描述 投票:0回答:1

我有一项特殊的工作,使我需要一个自定义的序列化程序,它将一个字段添加到修改DictAnnotation批注的字段中,它可以工作。但是@ JsonFormat不起作用。我的createTime字段过去看起来像这样:

"createTime":"2019-12-12"

现在:

"createTime":1577835397615

未被DictAnnotation修改的字段使用了默认的JsonSerializer,所以我不知道问题出在哪里。

我的主要代码如下:

绑定自定义SerializerModifier

@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    SimpleModule simpleModule = new SimpleModule().setSerializerModifier(new DictSerializerModifier());
    builder.modules(simpleModule);
    return builder;
}

customer SerializerModifier

public class DictSerializerModifier extends Jdk8BeanSerializerModifier {
    @Override
    public JsonSerializer<?> modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) {
        return new DictSerializer(null, (JsonSerializer<Object>) serializer);
    }
}

自定义序列化器

public class DictSerializer extends JsonSerializer<Object> implements ContextualSerializer {

    private static final String MY_BIZ_FIELD_SUFFIX = "_test";
    private DictAnnotation.ElementType type;
    private JsonSerializer<Object> defSerializer;

    public DictSerializer(DictAnnotation.ElementType type, JsonSerializer<Object> jsonSerializer) {
        this.defSerializer = jsonSerializer;
        this.type = type;
    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) {
        // my biz annotation
        DictAnnotation.ElementType elementType = Optional.ofNullable(property).map(b -> b.getAnnotation(DictAnnotation.class))
                .map(d -> d.type()).orElse(null);
        // if null, use defSerializer
        return elementType == null ? defSerializer : new DictSerializer(elementType, defSerializer);
    }

    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        defSerializer.serialize(value, gen, serializers);
        if (type != null) {
            String fieldName = gen.getOutputContext().getCurrentName();
            String codeLabel = RedisUtils.dictCodeToLabel(type, value.toString());
            gen.writeStringField(fieldName.concat(MY_BIZ_FIELD_SUFFIX), codeLabel);
        }
    }
}

测试pojo类别

public class TestVo {

    @DictAnnotation(type = A)
    private String aCode;

    @DictAnnotation(type = B)
    private String bCode;

    @DictAnnotation(type = C)
    private String cCode;

    @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
    private Date createTime;  
getter.... settter...

期待您的指导!

java json spring-boot jackson serializer
1个回答
0
投票

您能帮忙吗(添加@JsonSerialize如下所述)

@JsonSerialize(as = Date.class)
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd")
private Date createTime;
© www.soinside.com 2019 - 2024. All rights reserved.