springboot?接收LocalDateTime方式
本文基于jdk8。
1.標(biāo)準(zhǔn)日期格式轉(zhuǎn)換
本類型是指前端傳遞類似"yyyy-MM-dd HH:mm:ss"格式字符串,后端以 LocalDateTime類型接收。
spring默認(rèn)的使用jackson,故添加maven依賴,可參考官方文檔:
<dependency> ? ? <groupId>com.fasterxml.jackson.module</groupId> ? ? <artifactId>jackson-module-parameter-names</artifactId> </dependency> <dependency> ? ? <groupId>com.fasterxml.jackson.datatype</groupId> ? ? <artifactId>jackson-datatype-jdk8</artifactId> </dependency> <dependency> ? ? <groupId>com.fasterxml.jackson.datatype</groupId> ? ? <artifactId>jackson-datatype-jsr310</artifactId> </dependency>
添加一個配置類
@Configuration public class DateConfiguration { ?? ?@Bean ?? ?public ObjectMapper objectMapper(){ ?? ??? ?return new ObjectMapper() ?? ??? ??? ??? ?.registerModule(new ParameterNamesModule()) ?? ??? ??? ??? ?.registerModule(new Jdk8Module()) ?? ??? ??? ??? ?.registerModule(new JavaTimeModule()); ?? ?} }
基礎(chǔ)配置完成,使用時在對應(yīng)字段添加@DateTimeFormat 進(jìn)行反序列化或者@JsonFormat序列化。
2.非json請求時間戳轉(zhuǎn)換
本類型指在前端非json請求,傳遞參數(shù)為時間戳,然后轉(zhuǎn)為LocalDateTime。
可在上文基礎(chǔ)上添加配置,示例如下:
@Configuration public class DateConfiguration { ?? ?@Bean ?? ?public ObjectMapper objectMapper(){ ?? ??? ?return new ObjectMapper() ?? ??? ??? ??? ?.registerModule(new ParameterNamesModule()) ?? ??? ??? ??? ?.registerModule(new Jdk8Module()) ?? ??? ??? ??? ?.registerModule(new JavaTimeModule()); ?? ?} ? ? @Bean ? ? public Formatter<LocalDateTime> localDateTimeFormatter() { ? ? ? ? return new Formatter<LocalDateTime>() { ? ? ? ? ? ? @Override ? ? ? ? ? ? public LocalDateTime parse(String text, Locale locale) ?{ ? ? ? ? ? ? ? ? return Instant ? ? ? ? ? ? ? ? ? ? ? ? .ofEpochMilli(Long.parseLong(text)) ? ? ? ? ? ? ? ? ? ? ? ? .atZone(ZoneOffset.ofHours(8)) ? ? ? ? ? ? ? ? ? ? ? ? .toLocalDateTime(); ? ? ? ? ? ? } ? ? ? ? ? ? @Override ? ? ? ? ? ? public String print(LocalDateTime object, Locale locale) { ? ? ? ? ? ? ? ? return DateTimeFormatter.ISO_DATE.format(object); ? ? ? ? ? ? } ? ? ? ? }; ? ? } }
3.json請求時間戳轉(zhuǎn)換
本類型指在前端json請求,傳遞參數(shù)為時間戳,然后轉(zhuǎn)為LocalDateTime。
1.自定義解析注解
@Retention (RetentionPolicy.RUNTIME) @JacksonAnnotationsInside @JsonDeserialize(using = CustomLocalDateTimeDeserializer.class) public @interface StampToLocalDateTime { }
2.自定義解析類
public class CustomLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> ?{ ? ? @Override ? ? public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException{ ? ? ? ? if (StringUtils.isEmpty(jsonParser.getText())) { ? ? ? ? ? ? return null; ? ? ? ? } ? ? ? ? return Instant ? ? ? ? ? ? ? ? .ofEpochMilli(Long.parseLong(jsonParser.getText())) ? ? ? ? ? ? ? ? .atZone(ZoneOffset.ofHours(8)) ? ? ? ? ? ? ? ? .toLocalDateTime(); ? ? } }
在需要使用的字段添加@StampToLocalDateTime即可。示例如下
public class DemoReq ?{ ?? ? ?? ?@StampToLocalDateTime ? ? private LocalDateTime signTime; }
4.序列化擴(kuò)展
有時返回前端數(shù)據(jù),要包裝下信息(比如返回全路徑地址及某些參數(shù)),直接硬編碼不夠優(yōu)雅。這時可以通過序列化操作,實現(xiàn)ContextualSerializer接口,要進(jìn)行一些額外操作,。
1.自定義注解
@Retention (RetentionPolicy.RUNTIME) @JacksonAnnotationsInside @JsonSerializer(using = FullUrlSerializer.class) public @interface FullUrl { ??? ?String value() default ""; }
2.自定義序列類
public class FullUrlSerializer extends JsonSerializer<String> implements ContextualSerializer { ? ? private String params; ? ? @Value("${domain}") ? ? private String domain; ? ? public FullUrlSerializer() { ? ? } ? ? public FullUrlSerializer(String params) { ? ? ? ? this.params = params; ? ? } ? ? @Override ? ? public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException { ? ? ? ? if (property == null) { ? ? ? ? ? ? return prov.findNullValueSerializer(null); ? ? ? ? } ? ? ? ? if (Objects.equals(property.getType().getRawClass(), String.class)) { ? ? ? ? ? ? FullUrl fullUrl = property.getAnnotation(FullUrl.class); ? ? ? ? ? ? if (fullUrl == null) { ? ? ? ? ? ? ? ? fullUrl = property.getContextAnnotation(FullUrl.class); ? ? ? ? ? ? } ? ? ? ? ? ? if (fullUrl != null) { ? ? ? ? ? ? ? ? return new FullUrlSerializer(fullUrl.value()); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? return prov.findValueSerializer(property.getType(), property); ? ? } ? ? @Override ? ? public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { ? ? ? ? String url = ""; ? ? ? ? if (!StringUtils.isEmpty(value)) { ? ? ? ? ? ? url = domain.concat(value); ? ? ? ? ? ? if (!StringUtils.isEmpty(params)) { ? ? ? ? ? ? ? ? url.contains(params); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? gen.writeString (url); ? ? } }
5.swagger支持
要使swagger支持LocalDateTime等類型可以設(shè)置directModelSubstitute,示例如下:
@Configuration public abstract class SwaggerConfiguration { ?? ?@Bean ?? ?public Docket createRestApi() { ?? ??? ?return new Docket(DocumentationType.SWAGGER_2) ?? ??? ??? ??? ?.directModelSubstitute(LocalDateTime.class,String.class) ?? ??? ??? ??? ?.directModelSubstitute(LocalDate.class, String.class) ?? ??? ??? ??? ?.directModelSubstitute(LocalTime.class, String.class) ?? ??? ??? ??? ?.directModelSubstitute(ZonedDateTime.class,String.class) ?? ??? ??? ??? ?.build(); ?? ?} }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Mybatis中isNotNull與isNotEmpty的使用心得
這篇文章主要介紹了Mybatis中isNotNull與isNotEmpty的使用心得,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03Java基礎(chǔ)篇之serialVersionUID用法及注意事項詳解
這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)篇之serialVersionUID用法及注意事項的相關(guān)資料,SerialVersionUID屬性是用于序列化/反序列化可序列化類的對象的標(biāo)識符,我們可以用它來記住可序列化類的版本,以驗證加載的類和序列化對象是否兼容,需要的朋友可以參考下2024-02-02JDK14的新特性NullPointerExceptions的使用
這篇文章主要介紹了JDK14的新特性NullPointerExceptions的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Java實現(xiàn)按權(quán)重隨機(jī)數(shù)
這篇文章主要介紹了Java實現(xiàn)按權(quán)重隨機(jī)數(shù),本文給出了提出問題、分析問題、解決問題三個步驟,需要的朋友可以參考下2015-04-04Lombok注解之@SuperBuilder--解決無法builder父類屬性問題
這篇文章主要介紹了Lombok注解之@SuperBuilder--解決無法builder父類屬性問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09IntelliJ IDEA 使用經(jīng)驗總結(jié)(推薦)
這篇文章主要介紹了IntelliJ IDEA 使用經(jīng)驗總結(jié),非常不錯,具有參考價值,需要的朋友可以參考下2018-02-02windows下vscode+vs2019開發(fā)JNI的示例
本文給大家普及windows下vscode+vs2019開發(fā)JNI的示例以及各個環(huán)節(jié)的注意事項,文章通過示例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-06-06