我有一项特殊的工作,使我需要一个自定义的序列化程序,它将一个字段添加到修改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...
期待您的指导!
您能帮忙吗(添加@JsonSerialize如下所述)
@JsonSerialize(as = Date.class)
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd")
private Date createTime;