SpringBoot 枚舉類型的自動轉(zhuǎn)換的實現(xiàn)
需求:一般我們在數(shù)據(jù)庫都會定義數(shù)值型的枚舉常量,不管是序列化還是反序列化都是需要我們手動去轉(zhuǎn)換成枚舉類型的,既然這樣我們能不能讓它們自動轉(zhuǎn)換呢?接下來我們就來嘗試一下:
首先解決如何接收枚舉類型。
枚舉父類
/**
* @author rookie
*/
public interface IEnum<T extends Serializable> {
/**
* 獲取值
* @return 值
*/
T getValue();
}1、請求頭接收參數(shù)
添加Convert
@Component
public class EnumConvertFactory implements ConverterFactory<String, IEnum<?>> {
@Override
public <T extends IEnum<?>> Converter<String, T> getConverter(Class<T> targetType) {
return new StringToEnum<>(targetType);
}
public static class StringToEnum<T extends IEnum<?>> implements Converter<String, T> {
private final Class<T> targetType;
public StringToEnum(Class<T> targetType) {
this.targetType = targetType;
}
@Override
public T convert(String source) {
if (!StringUtils.hasText(source)) {
return null;
}
return (T) EnumConvertFactory.getEnum(this.targetType, source);
}
}
public static <T extends IEnum<?>> T getEnum(Class<T> targetType, String source) {
for (T constant : targetType.getEnumConstants()) {
if (source.equals(String.valueOf(constant.getValue()))) {
return constant;
}
}
return null;
}
}注冊Convert
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private EnumConvertFactory enumConvertFactory;
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverterFactory(enumConvertFactory);
}
}我們只要實現(xiàn) IEnum ,然后在我們的接收實體類中定義相應的枚舉類型就能自動轉(zhuǎn)換成枚舉類型了,比如這樣:
@Getter
@AllArgsConstructor
public enum TestEnum implements IEnum<String>{
/**
* 測試
*/
TEST_ENUM("1","2");
private final String value;
private final String msg;
}2、請求體接收
Jackson接收枚舉
如果我們接收的是 JSON 字符串類型,那么 Jackson 默認是根據(jù)下標進行轉(zhuǎn)換的,和我們根據(jù)匹配值獲取相應枚舉不符,所以進行以下更改:
添加枚舉反序列化處理器
@Data
@EqualsAndHashCode(callSuper = true)
public class EnumDeserializer extends JsonDeserializer<Enum<?>> implements ContextualDeserializer {
private Class<?> target;
@SuppressWarnings("all")
@Override
public Enum<?> deserialize(JsonParser jsonParser, DeserializationContext ctx) throws IOException {
if (!StringUtils.hasText(jsonParser.getText())) {
return null;
}
if (IEnum.class.isAssignableFrom(target)) {
return (Enum<?>) EnumConvertFactory.getEnum((Class) target, jsonParser.getText());
}
return null;
}
/**
* @param ctx ctx
* @param property property
* @return 1
* @throws JsonMappingException
*/
@Override
public JsonDeserializer<?> createContextual(DeserializationContext ctx, BeanProperty property) throws JsonMappingException {
Class<?> rawCls = ctx.getContextualType().getRawClass();
EnumDeserializer enumDeserializer = new EnumDeserializer();
enumDeserializer.setTarget(rawCls);
return enumDeserializer;
}
}注冊處理器
@Component
public class JacksonConfig implements SmartInitializingSingleton {
@Autowired
private ObjectMapper objectMapper;
@Override
public void afterSingletonsInstantiated() {
SimpleModule simpleModule = new SimpleModule();
simpleModule.addDeserializer(Enum.class, new EnumDeserializer());
objectMapper.registerModule(simpleModule);
}
}使用方法和上面一致。
3、添加自定義枚舉序列化
接下來我們就要解決如何將數(shù)據(jù)庫中的數(shù)值常量枚舉轉(zhuǎn)換成
jackson 序列化默認是按照名稱序列化的,和我們想返回枚舉中的某個值不符,下面我們進行一下小的改動:
添加序列化處理器
public class IEnumSerializer extends JsonSerializer<IEnum> {
@Override
public void serialize(IEnum iEnum, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(iEnum.getName());
}
}注冊序列化處理器
@Component
public class BeanLoadProcess implements SmartInitializingSingleton {
@Autowired
private ObjectMapper objectMapper;
@Override
public void afterSingletonsInstantiated() {
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(IEnum.class,new IEnumSerializer());
objectMapper.registerModule(simpleModule);
}
}因為我們先一步是讓數(shù)據(jù)庫中的常量能轉(zhuǎn)換成枚舉類型,這里我們定義一下 Mybatis plus(我用的是plus) 的枚舉處理器
mybatis-plus:
configuration:
default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler好了這樣就行了。
到此這篇關(guān)于Spring Boot 枚舉類型的自動轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)Spring Boot 枚舉類型的自動轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaWeb使用Cookie模擬實現(xiàn)自動登錄功能(不需用戶名和密碼)
不需要填寫用戶名和密碼自動登錄系統(tǒng),其實現(xiàn)思路使用cookie模擬瀏覽器自動登錄,對cookie實現(xiàn)自動登錄功能感興趣的朋友一起學習吧2016-08-08
SpringBoot整合RocketMQ批量發(fā)送消息的實現(xiàn)代碼
這篇文章主要介紹了SpringBoot整合RocketMQ批量發(fā)送消息的實現(xiàn),文中通過代碼示例講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-04-04
SpringMVC攔截器實現(xiàn)監(jiān)聽session是否過期詳解
這篇文章主要介紹了SpringMVC攔截器實現(xiàn)監(jiān)聽session是否過期詳解,還是比較不錯的,這里分享給大家,供需要的朋友參考。2017-11-11
利用Springboot+vue實現(xiàn)圖片上傳至數(shù)據(jù)庫并顯示的全過程
最近遇到個需求,需要將圖片在前端上傳到服務器進行保存,然后讀取到前端進行展示,這篇文章主要給大家介紹了關(guān)于利用Springboot+vue實現(xiàn)圖片上傳至數(shù)據(jù)庫并顯示的相關(guān)資料,需要的朋友可以參考下2023-04-04

