1. 程式人生 > 其它 >MongoDB+SpringBoot 自定義型別轉換器

MongoDB+SpringBoot 自定義型別轉換器

技術標籤:Springmongodbspringjavaspring bootmongodb

MongoDB+SpringBoot 自定義型別轉換器

直接程式碼

package pers.jssd.mongodbcostomconverter.config;

import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter; import org.springframework.data.convert.WritingConverter; import org.springframework.data.mongodb.core.convert.MongoCustomConversions; import pers.jssd.mongodbcostomconverter.entity.constant.SexEnum; import java.time.LocalDateTime; import java.
time.format.DateTimeFormatter; /** * MongoDB 自定義轉換器 * * @author [email protected] * @date 2021/1/16 16:02 */ @SpringBootConfiguration public class MongoConverterConfig { /** * 註冊 自定義的mongo轉換器 * * @return 返回註冊成功的 MongoCustomConversions */ @Bean public MongoCustomConversions customConversions
() { return MongoCustomConversions.create(mongoConverterConfigurationAdapter -> { mongoConverterConfigurationAdapter.registerConverter(new CustomLocalDateTimeToStringConverter()); mongoConverterConfigurationAdapter.registerConverter(new CustomStringToLocalDateTimeConverter()); mongoConverterConfigurationAdapter.registerConverter(new CustomEnumToIntegerConverter()); mongoConverterConfigurationAdapter.registerConverter(new CustomIntegerToEnumConverter()); }); } @WritingConverter private static class CustomLocalDateTimeToStringConverter implements Converter<LocalDateTime, String> { @Override public String convert(LocalDateTime source) { DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); return df.format(source); } } @ReadingConverter private static class CustomStringToLocalDateTimeConverter implements Converter<String, LocalDateTime> { @Override public LocalDateTime convert(String source) { DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); try { return LocalDateTime.parse(source, df); } catch (Exception e) { return null; } } } @WritingConverter private static class CustomEnumToIntegerConverter implements Converter<SexEnum, Integer> { @Override public Integer convert(SexEnum source) { return source.ordinal(); } } @ReadingConverter private static class CustomIntegerToEnumConverter implements Converter<Integer, SexEnum> { @Override public SexEnum convert(Integer source) { if (source < 0 || source >= SexEnum.values().length) { throw new IndexOutOfBoundsException("Invalid ordinal"); } return SexEnum.values()[source]; } } }

這裡定義了四個轉換器, 一個是 LocalDateTime 和 String 互轉, 一個是 列舉型別和 Integer互轉.

注意 @WritingConverter 和 @ReadingConverter 註解. 這兩個註解的意思是, 往庫中寫東西時候執行, 和從庫中讀取資料時候執行. 不能省略的, 比如我把列舉轉換的ReadingConverter去掉了, 存庫的時候, 所有的Integer型別欄位都會嘗試轉換為Enum, 轉換失敗就報錯.