SpringBoot--LocalDateTime--グローバルフォーマット変換/フロントエンド入力パラメーター

元のURL:SpringBoot--LocalDateTime--グローバルフォーマット変換/フロントエンド入力パラメーター

序章

説明する

        プロジェクトでは、作成時間、更新時間など、フロントエンド時間とバックエンド時間が変換されるシナリオがよくあります。一般に、フロントエンドとバックエンドは、タイムスタンプまたは年-月-日の形式で渡されます。

        バックエンドがフロントエンドのパラメータを受け取り、毎回手動で目的の形式に変換する場合、バックエンドがデータを目的の形式に送信するたびに手動でデータを目的の形式に処理するのは面倒です。フロントエンド。

        上記の理由に基づいて、この記事では例を使用してSpringBootグローバル形式の構成を紹介し、フロントエンドから経過した時間をLocalDateTimeに自動的に変換します。(この記事では、年-月-日形式の変換方法のみを紹介します。例:2021-09-16 21:13:21 =>LocalDateTime。タイムスタンプをLocalDateTimeに変換する方法も同様です)。

プログラム紹介

構成するシナリオは2つあります(Content-Typeによって異なります)。

  1. application/x-www-form-urlencoded和multipart/form-data
    1. このケースはここに次のように記録されます:@RequestBodyを使用しないでください
  2. アプリケーション/json
    1. すなわち:@RequestBodyを使用したインターフェース
    2. このケースはここに次のように記録されます:use @RequestBody

述べる

次のように構成できると言う人もいます。

春:
  ジャクソン:
    日付形式:yyyy-MM-dd HH:mm:ss
    タイムゾーン:GMT + 8
    シリアル化:
      write-dates-as-timestamps:false

この構成はDateにのみ適用され、LocalDateTimeなどには適用されません。
この形式は、日付のシリアル化/逆シリアル化に使用されます:「2020-08-19T16:30:18.823 + 00:00」。

@RequestBodyを使用しない

オプション1:@ ControllerAdvice + @ InitBinder

構成クラス

package com.example.config;

import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;

import java.beans.PropertyEditorSupport;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

@ControllerAdvice
public class LocalDateTimeAdvice {
    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(LocalDateTime.class, new PropertyEditorSupport() {
            @Override
            public void setAsText(String text) throws IllegalArgumentException {
                setValue(LocalDateTime.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
            }
        });

        binder.registerCustomEditor(LocalDate.class, new PropertyEditorSupport() {
            @Override
            public void setAsText(String text) throws IllegalArgumentException {
                setValue(LocalDate.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd")));
            }
        });

        binder.registerCustomEditor(LocalTime.class, new PropertyEditorSupport() {
            @Override
            public void setAsText(String text) throws IllegalArgumentException {
                setValue(LocalTime.parse(text, DateTimeFormatter.ofPattern("HH:mm:ss")));
            }
        });
    }
}

実在物

package com.example.business.entity;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.time.LocalDateTime;

@Data
@AllArgsConstructor
public class User {
    private Long id;

    private String userName;

    private LocalDateTime createTime;
}

コントローラ

package com.example.business.controller;

import com.example.business.entity.User;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("user")
public class UserController {
    @PostMapping("save")
    public User save(User user) {
        System.out.println("保存用户:" + user);
        return user;
    }
}

テスト

postman访问:http:// localhost:8080 / user / save?userName = Tony&createTime = 2021-09-16 21:13:21

郵便配達員の結果:

バックエンドの結果:

オプション2:カスタムパラメーターコンバーター(コンバーター)

カスタムパラメータコンバータであるorg.springframework.core.convert.converter.Converterを実装します。

構成クラス

package com.example.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Configuration
public class LocalDateTimeConfig {

    @Bean
    public Converter<String, LocalDateTime> localDateTimeConverter() {
        return new LocalDateTimeConverter();
    }

    public static class LocalDateTimeConverter implements Converter<String, LocalDateTime> {
        @Override
        public LocalDateTime convert(String s) {
            return LocalDateTime.parse(s, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        }
    }
}

実在物

package com.example.business.entity;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.time.LocalDateTime;

@Data
@AllArgsConstructor
public class User {
    private Long id;

    private String userName;

    private LocalDateTime createTime;
}

コントローラ

package com.example.business.controller;

import com.example.business.entity.User;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("user")
public class UserController {
    @PostMapping("save")
    public User save(User user) {
        System.out.println("保存用户:" + user);
        return user;
    }
}

テスト

postman访问:http:// localhost:8080 / user / save?userName = Tony&createTime = 2021-09-16 21:13:21

郵便配達員の結果:

バックエンドの結果

@RequestBodyを使用する

シナリオ1:ObjectMapperを構成する

方法1:構成クラスのみを使用する

このメソッドはObjectMapperを構成するだけでよく、エンティティは@JsonFormatを追加する必要はありません。

構成クラス

package com.example.common.config;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.std.DateDeserializers;
import com.fasterxml.jackson.databind.ser.std.DateSerializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import lombok.SneakyThrows;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;

@Configuration
public class JackSonConfig {
    @Bean
    public ObjectMapper ObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        JavaTimeModule javaTimeModule = new JavaTimeModule();

        // 序列化
        javaTimeModule.addSerializer(
                LocalDateTime.class,
                new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        javaTimeModule.addSerializer(
                LocalDate.class,
                new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        javaTimeModule.addSerializer(
                LocalTime.class,
                new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
        javaTimeModule.addSerializer(
                Date.class,
                new DateSerializer(false, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")));

        // 反序列化
        javaTimeModule.addDeserializer(
                LocalDateTime.class,
                new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        javaTimeModule.addDeserializer(
                LocalDate.class,
                new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        javaTimeModule.addDeserializer(
                LocalTime.class,
                new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
        javaTimeModule.addDeserializer(Date.class, new DateDeserializers.DateDeserializer(){
            @SneakyThrows
            @Override
            public Date deserialize(JsonParser jsonParser, DeserializationContext dc){
                String text = jsonParser.getText().trim();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                return sdf.parse(text);
            }
        });

        objectMapper.registerModule(javaTimeModule);
        return objectMapper;
    }

}

実在物

package com.example.business.entity;

import lombok.Data;

import java.time.LocalDateTime;

@Data
public class User {
    private Long id;

    private String userName;

    private LocalDateTime createTime;
}

コントローラ

package com.example.business.controller;

import com.example.business.entity.User;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("user")
public class UserController {
    @PostMapping("save")
    public User save(@RequestBody User user) {
        System.out.println("保存用户:" + user);
        return user;
    }
}

テスト

バックエンドの結果

保存用户:User(id=null, userName=Tony, createTime=2021-09-16T21:13:21)

方法2:構成クラス+ @JsonFormat

このメソッドはObjectMapperを構成する必要があり、Entityも@JsonFormatを追加する必要があります。

構成クラス

package com.example.common.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import org.springframework.boot.jackson.JsonComponent;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper serializingObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        // 自动扫描并注册相关模块
        objectMapper.findAndRegisterModules();

        // 手动注册相关模块
        // objectMapper.registerModule(new ParameterNamesModule());
        // objectMapper.registerModule(new Jdk8Module());
        // objectMapper.registerModule(new JavaTimeModule());
        return objectMapper;
    }

}

実在物

package com.example.business.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.time.LocalDateTime;

@Data
public class User {
    private Long id;

    private String userName;

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

コントローラ

package com.example.business.controller;

import com.example.business.entity.User;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("user")
public class UserController {
    @PostMapping("save")
    public User save(@RequestBody User user) {
        System.out.println("保存用户:" + user);
        return user;
    }
}

テスト

バックエンドの結果

保存用户:User(id=null, userName=Tony, createTime=2021-09-16T21:13:21)

おすすめ

転載: blog.csdn.net/feiying0canglang/article/details/123967073