Я пытаюсь получить карту от объекта, используя Jackson ObjectMapper:
ObjectMapper oMapper = ObjectMapperWithDate.getObjectMapper();
Map<String, Object> map = oMapper.convertValue(obj, Map.class);
У меня проблемы с полями Date, поскольку на карте они становятся объектами Long.
Я добавил де / сериализаторы, как в ObjectMapper меняет Date на String
public class ObjectMapperWithDate {
@Bean
public static ObjectMapper getObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.registerModule(
new SimpleModule("foo")
.addDeserializer(Date.class, new DateDeserializer())
.addSerializer(Date.class, new DateSerializer())
);
return mapper;
}
public static class DateSerializer extends StdScalarSerializer<Date> {
public DateSerializer() {
super(Date.class);
}
@Override
public void serialize(Date value, JsonGenerator gen, SerializerProvider provider)
throws IOException {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH);
String output = formatter.format(value);
gen.writeString(output);
}
}
public static class DateDeserializer extends StdScalarDeserializer<Date> {
public DateDeserializer() {
super(Date.class);
}
@Override
public Date deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException {
try {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH);
return formatter.parse(p.getValueAsString());
} catch (Exception e) {
return null;
}
}
}
}
Конечно, вызов для преобразователя выглядит немного иначе:
ObjectMapper oMapper = ObjectMapperWithDate.getObjectMapper();
Map<String, Object> map = oMapper.convertValue(obj, Map.class);
Теперь объекты Date становятся объектами String на карте. С датами, правильно представленными в них. Но мне нужно, чтобы они оставались , чтобы иметь тип даты. Что интересно, если я поставлю точки останова в десериализаторе, это никогда не будет достигнуто. Таким образом, десериализатор никогда не достигается, я думаю, это потому, что преобразователь после сериализации делает Date String или Long, в зависимости от SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, и никогда не распознает Date во время десериализации.
Как сделать так, чтобы свойства Date оставались объектами Date после сопоставления? Мне нужно, чтобы они были распознаны.
Кстати, свойства BigDecimal превращаются в двойные. Вроде бы похожая проблема, но эти два типа не имеют большого значения для моей дальнейшей работы.