ObjectMapper меняет дату на строку - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь использовать Jackson ObjectMappper для преобразования моего Java POJO в Map.Но при конвертации Дата изменится на Строковую.

Это мой POJO:

public class Sample {

    @Id
    private String id;
    private Date date;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

Вот мой код:

@Test
public void testGenMap() {
    Sample sample = new Sample();
    sample.setId("a");
    sample.setDate(new Date());
    Map<String, Object> map = generateMap(sample);
    System.out.println(map.get("date") instanceof Date); //false
}

private Map<String, Object> generateMap(Sample sample) {
Map<String, Object> map = CommonsContextUtil.getBean(ObjectMapper.class).convertValue(sample,Map.class);
        map.values().removeIf(Objects::isNull);
        return map;
    }

Я знаю, что здесь уже есть возможный ответ здесь .Но мой ObjectMapper уже настроен таким же образом, и все же он не работает.

Вот компонент ObjectMapper:

@Bean
public ObjectMapper objectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    return mapper;
}

1 Ответ

0 голосов
/ 25 января 2019

Когда дело доходит до дат, я обычно создаю свой собственный сериализатор и десериализатор примерно так. Это должно решить вашу проблему.

@Bean
public ObjectMapper objectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    registerModule(
        new SimpleModule("foo")
            .addDeserializer(Date.class, new DateDeserializer())
            .addSerializer(Date.class, new DateSerializer())
    );
    return mapper;
}

Тогда есть 2 статических метода для десериализации и сериализации:

    public static class DateSerializer extends StdScalarSerializer<Date> {

        public DateSerializer() {
            super(Date.class);
        }

        @Override
        public void serialize(Date value, JsonGenerator gen, SerializerProvider provider)
            throws IOException {
            String output = value.toString();
            gen.writeString(output);
        }
    }

    public static class DateDeserializer extends StdScalarDeserializer<Date> {

        public DateDeserializer() {
            super(Date.class);
        }

        @Override
        public LocalDate deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException {
            try {
                return Date.parse(p.getValueAsString());
            } catch (Exception e) {
                return null;
            }
        }
    }
...