Как отправить / получить объект даты в другом формате в формате JSON, а не в метке времени? - PullRequest
1 голос
/ 20 октября 2019

У меня есть следующий POJO, который я использую для отправки в качестве сообщений rabbitmq:

public class MyMessage {
    private String id;
    private String name;
    private Date createdDt;

    @JsonCreator
    public MyMessage(
        @JsonProperty("id") String id,
        @JsonProperty("name") String name,
        @JsonProperty("createdDt") Date createdDt
    ) {
        this.id = id;
        this.name = name;
        this.createdDt = createdDt;
    }
}

Проблема в том, что когда я отправляю его с использованием rabbitTemplate.convertAndSend(), createdDt будет вметка времени Unix в сообщении JSON. Мне нужно, чтобы createdDt в JSON после сериализации было в формате dd-MM-yyyy HH:mm:ss.

. Я не хочу менять свойство createdDt в классе MyMessage на строку в этомформатированная дата, потому что я могу захотеть использовать POJO в другом месте, где в коде и дата в виде строки неудобна позже. Также неправильно звучит дата в строке только для того, чтобы она была в определенном формате.

Когда я получаю сообщение обратно, мне также нужно десериализовать эту строкув формате dd-MM-yyyy HH:mm:ss обратно в объект Date.

Как сохранить createdDt как объект Date при отправке даты в другом формате при сериализации и затем получить строкуобратно десериализован как объект даты?

Ответы [ 3 ]

2 голосов
/ 20 октября 2019

Я рекомендую не использовать java.util.Date, но предпочитаю Java 8+ Time API. В этом случае вы можете импортировать встроенную поддержку Джексона через модуль com.fasterxml.jackson.datatype:jackson-datatype-jsr310 и ...

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());

... по умолчанию отобразит LocalDateTime как ISO 8601 строка.

Ссылка: https://fasterxml.github.io/jackson-datatype-jsr310/javadoc/2.7/com/fasterxml/jackson/datatype/jsr310/JavaTimeModule.html

2 голосов
/ 20 октября 2019

Если вы должны использовать java.util.Date, просто добавьте следующую аннотацию в поле createdDt

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy HH:mm:ss")
private Date createdDt;
1 голос
/ 20 октября 2019

С учетом конкретных требований, касающихся сериализации / десериализации поля, я бы предложил использовать пользовательский сериализатор / десериализатор.

public class CustomDateSerializer extends StdSerializer<Date> {
 
    @Override
    public void serialize(Date value, JsonGenerator generator, SerializerProvider provider) 
        throws IOException, JsonProcessingException {

        // your implementation
    }
}

public class CustomDateDeserializer extends StdDeserializer<Item> { 

    @Override
    public Date deserialize(JsonParser jp, DeserializationContext ctxt) 
      throws IOException, JsonProcessingException {

      // your implementation
    }
}

Тогда вы можете просто пометить createdDt следующим образом:

public class MyMessage {
    private String id;
    private String name;
    private Date createdDt;

    @JsonCreator
    public MyMessage(
        @JsonProperty("id") String id,
        @JsonProperty("name") String name,
        @JsonProperty("createdDt") @JsonDeserialize(using = CustomDateDeserializer.class) @JsonSerialize(using = CustomDateSerializer.class) Date createdDt
    ) {
        this.id = id;
        this.name = name;
        this.createdDt = createdDt;
    }
}

Таким образом, вы поручаете Джексону использовать ваш конкретный сериализатор / десериализатор в определенном поле.

Если вы хотите, чтобы конфигурация применялась на уровне ObjectMapper, вы можете добиться этого с помощью такой регистрации модуля. :

SimpleModule myModule = new SimpleModule();
myModule.addSerializer(Date.class, new CustomDateSerializer());
myModule.addDeserializer(Date.class, new CustomDateDeserializer());

objectMapper.registerModule(myModule);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...