SpringBoot 枚舉類型的自動轉換的實現(xiàn)
需求:一般我們在數(shù)據(jù)庫都會定義數(shù)值型的枚舉常量,不管是序列化還是反序列化都是需要我們手動去轉換成枚舉類型的,既然這樣我們能不能讓它們自動轉換呢?接下來我們就來嘗試一下:
首先解決如何接收枚舉類型。
枚舉父類
/** * @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 ,然后在我們的接收實體類中定義相應的枚舉類型就能自動轉換成枚舉類型了,比如這樣:
@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ù)下標進行轉換的,和我們根據(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ù)值常量枚舉轉換成
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ù)庫中的常量能轉換成枚舉類型,這里我們定義一下 Mybatis plus(我用的是plus) 的枚舉處理器
mybatis-plus: configuration: default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler
好了這樣就行了。
到此這篇關于Spring Boot 枚舉類型的自動轉換的文章就介紹到這了,更多相關Spring Boot 枚舉類型的自動轉換內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JavaWeb使用Cookie模擬實現(xiàn)自動登錄功能(不需用戶名和密碼)
不需要填寫用戶名和密碼自動登錄系統(tǒng),其實現(xiàn)思路使用cookie模擬瀏覽器自動登錄,對cookie實現(xiàn)自動登錄功能感興趣的朋友一起學習吧2016-08-08SpringBoot整合RocketMQ批量發(fā)送消息的實現(xiàn)代碼
這篇文章主要介紹了SpringBoot整合RocketMQ批量發(fā)送消息的實現(xiàn),文中通過代碼示例講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-04-04SpringMVC攔截器實現(xiàn)監(jiān)聽session是否過期詳解
這篇文章主要介紹了SpringMVC攔截器實現(xiàn)監(jiān)聽session是否過期詳解,還是比較不錯的,這里分享給大家,供需要的朋友參考。2017-11-11利用Springboot+vue實現(xiàn)圖片上傳至數(shù)據(jù)庫并顯示的全過程
最近遇到個需求,需要將圖片在前端上傳到服務器進行保存,然后讀取到前端進行展示,這篇文章主要給大家介紹了關于利用Springboot+vue實現(xiàn)圖片上傳至數(shù)據(jù)庫并顯示的相關資料,需要的朋友可以參考下2023-04-04