MongoDB+SpringBoot 自定義型別轉換器
阿新 • • 發佈:2021-01-17
技術標籤: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, 轉換失敗就報錯.