Несколько форматов даты в Spring загружаются с использованием GSON - PullRequest
0 голосов
/ 13 июня 2019

Я использую пружинный ботинок с GSON.У меня есть компонент, который имеет 2 поля даты с разными форматами даты

  1. гггг-мм-дд чч: мм
  2. гггг-мм-дд

с пружинной загрузкой с помощью GSON я могу установить

spring.gson.date-format= yyyy-MM-dd hh:mm

, но ожидается, что второе поле будет следовать гггг-ММ-дд чч: мм.

Я знаю, что с помощью Джексона мы можем указать отдельную датуформатирует с аннотацией @JsonFormat, можем ли мы сделать что-то подобное, используя GSON с пружиной

1 Ответ

1 голос
/ 13 июня 2019

Вы можете попробовать пользовательские JsonSerializer & JsonDeserializer для настройки сериализации / десериализации полей компонента, простой пример:

pom.xml зависимости:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- Exclude the default Jackson dependency -->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-json</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.4</version>
        </dependency>
    </dependencies>

DemoApplication.lava :

package com.example.demo;

import com.google.gson.*;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        Gson gson = SpringApplication.run(DemoApplication.class, args).getBean(Gson.class);

        // json entity with timestamp -> dateFirst and dateSecond
        String jsonSomeEntity =
                   "{" +
                        "\"dateFirst\": \"" + Timestamp.valueOf(LocalDateTime.now()).getTime() + "\"," +
                        "\"dateSecond\": \"" + Timestamp.valueOf(LocalDateTime.now()).getTime() + "\"" +
                    "}";

        SomeEntity someEntity = gson.fromJson(jsonSomeEntity, SomeEntity.class);

        jsonSomeEntity = gson.toJson(someEntity);

        System.out.println(jsonSomeEntity);
    }

    private static final DateTimeFormatter FORMATTER_FIRST = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
    private static final DateTimeFormatter FORMATTER_SECOND = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    @Bean
    GsonBuilder gsonBuilder() {
        return new GsonBuilder()

                // SomeEntity to json
                // dateFirst  -> LocalDateTime -> timestamp
                // dateSecond -> LocalDate     -> timestamp
                .registerTypeAdapter(SomeEntity.class, (JsonSerializer<SomeEntity>) (entity, type, context) -> {
                    JsonObject jsonObject = new JsonObject();

                    long dateFirstTimeStamp = Timestamp.valueOf(entity.getDateFirst()).getTime();
                    long dateSecondTimeStamp = Timestamp.valueOf(entity.getDateSecond().atStartOfDay()).getTime();

                    jsonObject.addProperty("dateFirst", dateFirstTimeStamp);
                    jsonObject.addProperty("dateSecond", dateSecondTimeStamp);

                    return jsonObject;
                })

                // json ot SomeEntity
                // dateFirst  -> timestamp -> LocalDateTime -> "yyyy-MM-dd HH:mm"
                // dateSecond -> timestamp -> LocalDate     -> "yyyy-MM-dd"
                .registerTypeAdapter(SomeEntity.class, (JsonDeserializer<SomeEntity>) (json, type, context) -> {
                    long dateFirstTimeStamp = ((JsonObject) json).get("dateFirst").getAsLong();
                    long dateSecondTimeStamp = ((JsonObject) json).get("dateSecond").getAsLong();

                    LocalDateTime LocalDateTimeFirst = new Timestamp(dateFirstTimeStamp).toLocalDateTime();
                    LocalDate localDateSecond = new Timestamp(dateSecondTimeStamp).toLocalDateTime().toLocalDate();

                    String dateFirstFormatted = FORMATTER_FIRST.format(LocalDateTimeFirst);
                    String dateSecondFormatted = FORMATTER_SECOND.format(localDateSecond);

                    return new SomeEntity(
                            LocalDateTime.parse(dateFirstFormatted, FORMATTER_FIRST),
                            LocalDate.parse(dateSecondFormatted, FORMATTER_SECOND));
                });
    }

    public static class SomeEntity {
        private final LocalDateTime dateFirst;
        private final LocalDate dateSecond;

        public SomeEntity(LocalDateTime dateFirst, LocalDate dateSecond) {
            this.dateFirst = dateFirst;
            this.dateSecond = dateSecond;
        }

        public LocalDateTime getDateFirst() {
            return dateFirst;
        }

        public LocalDate getDateSecond() {
            return dateSecond;
        }
    }

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