假设我有以下课程:
class MyClass {
private Date dateToBeCustomeSerialized;
private Date dateToBeDefaultSerialized;
}
在我的Spring Boot应用程序中,我需要将每个Date
对象序列化为String
。出于这个目的,为了避免在任何地方插入@JsonSerializer
,我在应用程序级别引入了自定义Serializer。
问题是我想避免在名称(而不是值)dateToBeDefaultSerialized
的字段上使用自定义序列化程序,而我似乎无法找到实现此目的的方法。
这是我的自定义“全局”Date
序列化程序的样子:
@Bean
@Primary
public ObjectMapper serializingObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(Date.class, new DateSerializer());
objectMapper.registerModule(module);
return objectMapper;
}
public class DateSerializer extends JsonSerializer<Date> {
@Override
public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String date = sdf.format(value);
gen.writeString(date);
}
}
是否有使用默认序列化程序序列化名称dateToBeDefaultSerialized
的属性?
答案 0 :(得分:1)
通过实施ContextualSerializer
,可以获取当前序列化字段的名称。默认序列化可通过SerializerProvider
获得。尝试重写序列化器,如下所示:
class DateSerializer extends JsonSerializer<Date> implements ContextualSerializer {
private boolean doCustom;
DateSerializer() {}
private DateSerializer(boolean doCustom) { this.doCustom = doCustom; }
@Override
public void serialize(Date value, JsonGenerator gen, SerializerProvider provider) throws IOException {
if (doCustom) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String date = sdf.format(value);
gen.writeString(date);
} else {
provider.defaultSerializeDateValue(value, gen);
}
}
@Override
public JsonSerializer<Date> createContextual(SerializerProvider config, BeanProperty property) {
boolean doCustom = property == null || !"dateToBeDefaultSerialized".equals(property.getName());
return new DateSerializer(doCustom);
}
}