Странные трюки, глобальное форматирование даты springboot, немного ароматное!

Java
Странные трюки, глобальное форматирование даты springboot, немного ароматное!

Я недавно встречался с некоторыми компаниями, там есть какие-то Java-фреймворки и материалы интервью, кому нужно, могут получить сами в официальном аккаунте [ВВД программиста].


скажи заранее

В последнее время несколько сотрудников отдела обижались и увольнялись один за другим.После трех лет совместной работы они очень неохотно расставались с ними.В душе было нехорошее предчувствие,что это дело точно не так просто. После того, как я взял на себя проекты этих больших парней, моя догадка сбылась.В этот момент я на самом деле немного сожалею об этом, почему я не побил их, когда прощался! Хахаха~ И это желание побеждать людей становилось все сильнее и сильнее, когда я начал оптимизировать проекты нескольких братьев.

在这里插入图片描述

есть яма

Технический отдел организует кодекс прохождения и оптимизацию каждый месяц. В прошлом они рассмотрели и оптимизировали свои собственные проекты. Теперь, когда осталось несколько старших братьев, их проекты упали на мою голову. Самая болезненная вещь для программистов состоит в том, чтобы воспользоваться другими людьми и делать оптимизацию и трансформацию, потому что это не легче, чем рефакторинг проекта. Однако с военным заказом впереди нет никакого способа укусить пулю!

Первая точка оптимизации сделала меня немного сломленным. Навыки этих больших парней очень сильны, и они всегда были моими моделями для подражания, но почти все форматирование даты в проекте используется таким образом.SimpleDateFormat, реализованный в виде следующего кода, эмм~, как может что-то сделать раненый человек, хахаха~

SvcOrderDailyStatisticsPo orderDailyStatisticsPo = new SvcOrderDailyStatisticsPo();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date stationTime = dateFormat.parse(dateFormat.format(svcWorkOrderPo.getPayEndTime()));
orderDailyStatisticsPo.setStatisticalDate(stationTime);

Да и API времени и даты в проекте тоже сбивает с толку, учитывая, чтоjava.util.Dateиjava.util.CalendarОн не поддерживает часовой пояс и не является потокобезопасным.Вычисление даты относительно громоздкое.Технический отдел единодушно требует использования JDK1.8 или более поздней версии.java.time LocalDateTime. Но многие до сих пор используютjava.util.Dateиjava.util.CalendarДата обработки.

Оптимизация

Форматирование времени используется очень часто. Как сделать форматирование времени простым, не изобретая заново велосипед? Его следует абстрагировать и рассматривать как глобальный процесс форматирования даты. Далее кратко представлены в сочетании с практикой. Оптимизация.

Адрес теста:http://127.0.0.1:8080/timeTest


@GetMapping("/timeTest")
    public OrderInfo timeTest() {
        OrderInfo order = new OrderInfo();
        order.setCreateTime(LocalDateTime.now());
        order.setUpdateTime(new Date());
        return order;
    }
1. Аннотация @JsonFormat

использовать@JsonFormatАннотирование времени форматирования следует рассматривать как базовую операцию, большинство разработчиков используют этот метод, который прост и удобен.

/**
 * @Author: xiaofu
 * @Description:
 */
public class OrderInfo {

    @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;

    public LocalDateTime getCreateTime() {
        return createTime;
    }

    public void setCreateTime(LocalDateTime createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
}

Тестовые результаты обнаруженыDateтип иLocalDateTimeТипы все успешно отформатированы, но есть проблема, это все еще громоздко, нужно добавить поле даты каждого класса сущностей.@JsonFormatОбратите внимание, количество повторяющихся работ не мало. Тогда посмотри вниз~

在这里插入图片描述

2. Глобальная конфигурация (1)

Springbootуже предоставляет нам форматирование даты${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}, здесь нам нужно выполнить глобальную настройку, конфигурация относительно проста, и нет необходимости добавлять атрибут класса сущности@JsonFormatаннотация.

/**
 * @Author: xiaofu
 * @Description:
 */
public class OrderInfo {

    //@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    //@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;

    public LocalDateTime getCreateTime() {
        return createTime;
    }

    public void setCreateTime(LocalDateTime createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
}

просто используйте@ConfigurationОпределите класс конфигурации и внедрите дваBeanВы можете завершить процесс глобального форматирования даты, который я сейчас использую в своем проекте.

/**
 * @Author: xiaofu
 * @Description:
 */
@Configuration
public class LocalDateTimeSerializerConfig {

    @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
    private String pattern;

    @Bean
    public LocalDateTimeSerializer localDateTimeDeserializer() {
        return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));
    }

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());
    }
}

Этот способ может поддерживатьDateтип иLocalDateTimeТипы сосуществуют, то проблема в том, что глобальный формат времени теперьyyyy-MM-dd HH:mm:ss, но некоторые поля требуютyyyy-MM-dd

тогда вам нужно сотрудничать@JsonFormatИспользование аннотации, добавление атрибута определенного поля@JsonFormatАннотации достаточно, потому что@JsonFormatАннотация имеет более высокий приоритет и будет начинаться с@JsonFormatФормат времени метки аннотации является основным.

3. Глобальная конфигурация (2)

Реализация этой глобальной конфигурации аналогична вышеописанному эффекту, однако следует отметить, что после использования этой конфигурации поля настраиваются вручную.@JsonFormatАннотации больше не будут действовать.

/**
 * @Author: xiaofu
 * @Description:
 */
public class OrderInfo {

    //@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    //@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;

    public LocalDateTime getCreateTime() {
        return createTime;
    }

    public void setCreateTime(LocalDateTime createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
}

/**
 * @Author: xiaofu
 * @Description:
 */
@Configuration
public class LocalDateTimeSerializerConfig {

    @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
    private String pattern;

    @Bean
    @Primary
    public ObjectMapper serializingObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
        objectMapper.registerModule(javaTimeModule);
        return objectMapper;
    }

    public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
        @Override
        public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeString(value.format(ofPattern(pattern)));
        }
    }

    public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
        @Override
        public LocalDateTime deserialize(JsonParser p, DeserializationContext deserializationContext) throws IOException {
            return LocalDateTime.parse(p.getValueAsString(), ofPattern(pattern));
        }
    }
}

Суммировать

поделилсяSpringbootМаленькая хитрость в процессе разработки проекта, также я выплевываю ямки, встречающиеся при оптимизации проектов.Хотя оптимизация чужого кода дело относительно болезненное, но я действительно могу многому научиться в этом процессе.Улучшение навыков тоже очень помогает , потому что все они — сухие товары, которые на самом деле могут повысить эффективность разработки.


Небольшие преимущества:

Сотни различных технических электронных книг пересылаются друг другу, тсс~,бесплатноДайте мелких партнеров. Нет общественного внимания [Ответить666] Самовывоз