精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SpringBoot 使用轉換器將前端參數轉換為枚舉

開發 架構
最近遇到一個小伙伴問前端枚舉轉換問題,才意識到可以通過轉換器(Converter)自動將前端傳入的字段值使用枚舉接收。

[[421671]]

前言

最近遇到一個小伙伴問前端枚舉轉換問題,才意識到可以通過轉換器(Converter)自動將前端傳入的字段值使用枚舉接收。

我自己搗鼓了一番,現在記錄筆記分享一下!有興趣的小伙伴可以自己嘗試一下!

這里使用的是 MyBatis-Plus 和 SpringBoot 2.3.4.RELEASE

1實現過程

配置轉換器

  1. /** 
  2.  * @author liuzhihang 
  3.  * @date 2021/8/31 16:29 
  4.  */ 
  5. @Configuration 
  6. public class WebConfig implements WebMvcConfigurer { 
  7.  
  8.     @Override 
  9.     public void addFormatters(FormatterRegistry registry) { 
  10.  
  11.         registry.addConverterFactory(new ConverterFactory<Object, BaseEnum>() { 
  12.             @Override 
  13.             public <T extends BaseEnum> Converter<Object, T> getConverter(Class<T> targetType) { 
  14.  
  15.                 T[] enums = targetType.getEnumConstants(); 
  16.  
  17.                 return source -> { 
  18.  
  19.                     for (T e : enums) { 
  20.                         if (e.getCode().equals(source)) { 
  21.                             return e; 
  22.                         } 
  23.                     } 
  24.  
  25.                     throw new IllegalArgumentException("枚舉 Code 不正確"); 
  26.                 }; 
  27.             } 
  28.         }); 
  29.     } 

直接在 WebMvcConfigurer 里實現 addFormatters 方法即可,然后 new 一個 ConverterFactory。

WebMvcConfigurer 相信大家都不陌生,一般添加一些攔截器,通用校驗 token、日志等等都會用到。具體可以參考這篇文章:幾行代碼輕松實現跨系統傳遞 traceId,再也不用擔心對不上日志了!,里面有一些其他的應用。

就這些,很簡單的實現。下面介紹下項目的內容和代碼,方便理解。

項目代碼

  • 請求參數:
  1. POST http://localhost:8818/user/listByStatus 
  2. Content-Type: application/json 
  3.  
  4.   "orderStatus": 1 
  • Controller
  1. /** 
  2.  * @author liuzhihang 
  3.  * @date 2021/8/30 11:08 
  4.  */ 
  5. @Slf4j 
  6. @RestController 
  7. @RequestMapping("/user"
  8. public class UserController { 
  9.  
  10.     @Autowired 
  11.     private OrderService orderService; 
  12.  
  13.     @PostMapping(value = "/listByStatus"
  14.     public ResultVO<UserResponse> listByStatus(@Validated @RequestBody UserRequest request)  { 
  15.  
  16.         log.info("請求參數:{}", request); 
  17.  
  18.         List<TransOrder> orderList = orderService.getByOrderStatus(request.getOrderStatus()); 
  19.  
  20.         UserResponse response = new UserResponse(); 
  21.  
  22.         response.setRecords(orderList); 
  23.  
  24.         log.info("返回參數:{}", response); 
  25.  
  26.         return ResultVO.success(response); 
  27.     } 
  • Entity
  1. @Data 
  2. public class UserRequest { 
  3.  
  4.     private OrderStatusEnum orderStatus; 
  5.     private ViewStatusEnum viewStatus; 
  6.  
  7. @Data 
  8. public class UserResponse { 
  9.  
  10.     private List<TransOrder> records; 
  11.  

Web 傳入 orderStatus 為 1,而后端接收對象是 UserRequest 的 orderStatus 字段是個 OrderStatusEnum 類型的枚舉。

這里就需要自動將數字類型的字段轉換為枚舉字段。這個枚舉會直接通過 MyBatis-Plus 查詢。

為什么要這么用呢?

其實原因很簡單,使用枚舉限制數據庫字段的類型,比如數據庫狀態只有 0、1、2,那就和代碼里的枚舉對應起來。防止傳入其他值。

  • 枚舉
  1. public interface BaseEnum { 
  2.     Object getCode(); 
  1. public enum OrderStatusEnum implements BaseEnum { 
  2.  
  3.     INIT(0, "初始狀態"), 
  4.     SUCCESS(1, "成功"), 
  5.     FAIL(2, "失敗"); 
  6.  
  7.     @EnumValue 
  8.     @JsonValue 
  9.     private final int code; 
  10.  
  11.     private final String desc
  12.  
  13.     OrderStatusEnum(int code, String desc) { 
  14.         this.code = code; 
  15.         this.desc = desc
  16.     } 
  17.  
  18.     @Override 
  19.     public Integer getCode() { 
  20.         return code; 
  21.     } 
  22.  
  23.     public String getDesc() { 
  24.         return desc
  25.     } 

這里先聲明接口 BaseEnum,所有的枚舉都繼承這個接口,并實現 getCode 方法。

@EnumValue:MyBatis-Plus 的枚舉,和數據庫字段映射用的

@JsonValue:返回給前端時,這個枚舉字段序列化時,返回參數只顯示 code。

這樣就可以實現效果,請求參數為數字,接收對象字段為枚舉,返回字段也是 code。

效果

測試結果

測試結果經過驗證,是可以勝任傳入數值和字符串的。

也可以結合異常處理器,返回通用異常。具體怎么用查一查 @ExceptionHandler 就知道了。

具體說明

在 addFormatters 方法中可以看到 registry.addConverterFactory() 接收的是一個 ConverterFactory 對象。

  1. public interface ConverterFactory<S, R> { 
  2.  
  3.  <T extends R> Converter<S, T> getConverter(Class<T> targetType); 
  • S 就是傳入的字段類型(數字,字符串)
  • R 是要轉換為的類型(枚舉)
  • T 繼承了 R,其實就是參數對象中字段的類型

在 ConverterFactory 的 getConverter 方法則需要返回一個實際的轉換器 Converter

  1. @FunctionalInterface 
  2. public interface Converter<S, T> { 
  3.  
  4.  @Nullable 
  5.  T convert(S source); 
  6.  

convert 方法的入參是一個 source,就是要轉換為什么類型的,這里就是數字/字符串,然后返回一個枚舉即可。

注意這里加了 @FunctionalInterface 就意味著這里是可以用 lambda 表達式的。

2優化

一般 WebConfig 中除了實現 addFormatters 方法外,還會實現 addInterceptors 等等,這樣寫難免會很長,所以可以改為下面這種。

  1. @Configuration 
  2. public class WebConfig implements WebMvcConfigurer { 
  3.  
  4.     @Autowired 
  5.     private LogInterceptor logInterceptor; 
  6.  
  7.     @Autowired 
  8.     private AppTokenInterceptor appTokenInterceptor; 
  9.  
  10.  
  11.     @Autowired 
  12.     private EnumConverterFactory enumConverterFactory; 
  13.  
  14.     @Override 
  15.     public void addInterceptors(InterceptorRegistry registry) { 
  16.  
  17.         // 日志 
  18.         registry.addInterceptor(logInterceptor) 
  19.                 .addPathPatterns("/**"); 
  20.  
  21.         // app token校驗 
  22.         registry.addInterceptor(appTokenInterceptor) 
  23.                 .addPathPatterns("/app/**"); 
  24.  
  25.     } 
  26.  
  27.     @Override 
  28.     public void addFormatters(FormatterRegistry registry) { 
  29.          
  30.         // 枚舉轉換 
  31.         registry.addConverterFactory(enumConverterFactory); 
  32.     } 

這種就需要咱們創建 EnumConverterFactory 類并實現 ConverterFactory 接口了,還得注入到 Spring 容器中

  1. @Component 
  2. public class EnumConverterFactory implements ConverterFactory<Object, BaseEnum> { 
  3.  
  4.     @Override 
  5.     public <T extends BaseEnum> Converter<Object, T> getConverter(Class<T> targetType) { 
  6.  
  7.         return new EnumConverter<>(targetType); 
  8.     } 
  9. public class EnumConverter<T extends BaseEnum> implements Converter<Object, T> { 
  10.  
  11.     private final Class<T> targetType; 
  12.  
  13.     public EnumConverter(Class<T> targetType) { 
  14.         this.targetType = targetType; 
  15.     } 
  16.  
  17.     @Override 
  18.     public T convert(Object source) { 
  19.  
  20.         for (T e : targetType.getEnumConstants()) { 
  21.             if (e.getCode().equals(source)) { 
  22.                 return e; 
  23.             } 
  24.         } 
  25.  
  26.         throw new IllegalArgumentException("枚舉 Code 不正確"); 
  27.     } 

3總結

當然這里也有一些其他的優化點,比如可以使用緩存將 Convert 緩存起來。

 

不過我也遇到一個其他的問題,就是我 debug 斷點竟然一直沒有斷到轉換器中,不知道有沒有小伙伴嘗試過?

 

責任編輯:武曉燕 來源: 程序員小航
相關推薦

2013-06-13 15:10:27

.NET代碼轉換

2010-06-10 14:44:33

協議轉換器

2010-06-10 14:33:03

協議轉換器

2010-06-10 14:38:30

協議轉換器

2010-06-10 15:03:13

協議轉換器

2014-05-04 12:51:21

Javascript編譯器

2019-07-30 10:51:45

Markdown格式化文檔Linux

2023-08-25 14:47:56

TransFLACFLAC

2023-05-05 00:19:22

2018-03-23 09:29:56

深度學習神經網絡前端設計模型

2009-12-28 13:38:35

WPF類型轉換器

2009-06-17 11:31:23

Open XMLUOF文檔

2021-05-05 10:06:09

React應用程序微前端

2010-06-10 14:49:07

協議轉換器

2009-09-11 12:41:41

C#類型轉換

2024-05-29 08:12:55

接口參數格式

2009-07-15 16:56:59

Jython類型Java類型

2023-08-26 16:06:10

COBOLJava數據

2010-06-17 23:31:35

協議轉換器

2024-08-23 08:57:13

PyTorch視覺轉換器ViT
點贊
收藏

51CTO技術棧公眾號

一区免费在线| 免费在线观看国产精品| 久久青青视频| jvid福利写真一区二区三区| 欧美高清不卡在线| 四川一级毛毛片| 欧美人xxx| 国产一区二区h| 亚洲国产精品va| 日韩a在线播放| 三级在线观看| 久久精品国产网站| 在线观看欧美www| 天天干天天曰天天操| av影视在线| 久久久一区二区三区捆绑**| 国产精品福利在线| 久久国产美女视频| 色婷婷av一区二区三区丝袜美腿 | 五月激情四射婷婷| 伊人久久综合网另类网站| 亚洲欧洲日韩一区二区三区| 91精品久久久久久久久久久| 农村老熟妇乱子伦视频| 亚洲综合影院| 色婷婷综合五月| 成年丰满熟妇午夜免费视频 | 久久亚洲电影| 中文字幕日韩av电影| 午夜激情视频网| 亚洲风情在线资源| 亚洲少妇最新在线视频| 国产女人水真多18毛片18精品| 久久国产视频一区| 天天做综合网| 亚洲理论在线a中文字幕| www.国产视频.com| av官网在线播放| 国产三级一区二区三区| 春色成人在线视频| 一二三四区视频| 久久精品一区| 久久久久久久久电影| 女性裸体视频网站| 日韩av资源网| 91麻豆精品国产| 国产三级三级三级看三级| 羞羞污视频在线观看| 成人福利电影精品一区二区在线观看 | 久久伊人免费视频| 六月婷婷七月丁香| 国产亚洲高清一区| 欧美日韩免费观看一区二区三区 | 国产精品久久| www.99久久热国产日韩欧美.com| 国产91在线免费观看| 小明成人免费视频一区| 色婷婷综合久久| 毛片在线视频观看| 久久bbxx| 国产精品亲子乱子伦xxxx裸| 精品毛片久久久久久| 国产精品久久久午夜夜伦鲁鲁| 亚洲在线日韩| 韩国19禁主播vip福利视频| 三级av在线免费观看| 日韩电影免费在线观看| 亚洲黄色www| 亚洲高清无码久久| 好吊妞国产欧美日韩免费观看网站 | 欧美日韩精品二区第二页| 亚洲熟妇无码一区二区三区| 国产在线1区| 亚洲色图视频网| 中国女人做爰视频| 日韩伦理电影网站| 亚洲综合区在线| www.好吊操| 丝袜综合欧美| 亚洲成国产人片在线观看| 色欲色香天天天综合网www| 俄罗斯一级**毛片在线播放| 亚洲综合免费观看高清完整版| 一区中文字幕在线观看| 免费观看在线黄色网| 亚洲欧美日韩国产综合| 永久免费网站视频在线观看| 变态调教一区二区三区| 亚洲日穴在线视频| a级片一区二区| 国产淫片在线观看| 亚洲女子a中天字幕| 男人添女人下部视频免费| 91丝袜在线| 狠狠久久五月精品中文字幕| 成人在线观看a| 高清av不卡| 欧美三级中文字幕| 亚洲精品mv在线观看| 少妇精品视频在线观看| 日韩三级视频在线观看| 青青草原播放器| 91免费精品国偷自产在线在线| 日韩成人av在线| 毛片aaaaaa| 欧美日本免费| 日本不卡免费高清视频| 中文字幕av久久爽| 国产91在线看| 日韩久久不卡| 肉体视频在线| 在线亚洲一区观看| 在线视频日韩一区| 精品一区二区三区视频在线播放| 亚洲第一区在线观看| 亚洲精品乱码久久久久久久| 日韩国产在线| 欧美激情乱人伦一区| www.久久精品视频| 国产精品影视在线观看| 欧美精品二区三区四区免费看视频 | 美女网站视频在线观看| 精品久久影院| 久久久天堂国产精品女人| 久久久久在线视频| 国产激情偷乱视频一区二区三区 | 欧美男gay| 久久97精品久久久久久久不卡| 中文字幕在线播| 国产美女精品一区二区三区| 国产精品乱码| 日产精品久久久久久久性色| 国产精品毛片久久久久久久| 日本黄网站免费| 欧美日韩导航| 69久久夜色精品国产69| 国产综合在线播放| 一区二区三区日韩欧美| 污污的视频免费观看| japanese国产精品| 国产精品久久久久久久7电影| 国产精品久久久久久无人区 | 亚洲精品无人区| 中文字幕这里只有精品| 亚洲精美色品网站| 日韩男人的天堂| 高清成人免费视频| 制服诱惑一区| 日韩成人亚洲| 在线观看免费高清视频97| 亚洲中文无码av在线| 国产亚洲va综合人人澡精品 | 成人自拍视频网| 伊人成人开心激情综合网| 在线免费一区二区| 欧美激情中文不卡| 色噜噜狠狠永久免费| 国产韩日影视精品| 成人淫片在线看| 国产美女福利在线| 欧美精品丝袜久久久中文字幕| 妖精视频一区二区| 国产农村妇女毛片精品久久莱园子| 精品视频免费观看| 最新欧美电影| 日韩在线激情视频| 国产情侣在线播放| 亚洲一二三四区| 69亚洲乱人伦| 久久一区亚洲| 一区二区视频国产| 欧美性生活一级| 欧美精品手机在线| www.97av.com| 精品久久久在线观看| 亚洲av无码一区二区三区人 | 五月婷婷色综合| 色无极影院亚洲| 精品亚洲国产成人av制服丝袜| 日韩一二区视频| 四虎永久精品在线| 色综合五月天导航| 欧美男男激情freegay| 日韩欧美一区二区三区| 亚洲精品天堂网| 国产一区二区精品久久99| 亚洲国产精品无码观看久久| 亚洲黄页在线观看| 成人久久一区二区| 嗯啊主人调教在线播放视频 | 日本高清一区| 久久亚洲国产精品尤物| 成人97在线观看视频| 五十路在线视频| 欧美日韩国产在线观看| 国产一卡二卡在线| 国产精品久久毛片| 成人性生活免费看| 狠狠色综合日日| 18视频在线观看娇喘| 亚洲丁香日韩| 99re视频| 校园春色亚洲色图| 欧美激情第6页| 欧美三级电影一区二区三区| 亚洲激情成人网| 国产又粗又猛又黄又爽无遮挡| 亚洲国产精品久久艾草纯爱| 日本女人性生活视频| a级高清视频欧美日韩| 91香蕉视频污版| 午夜在线播放视频欧美| 亚洲永久激情精品| 亚洲春色h网| 国产欧美一区二区三区另类精品 | 国产日产精品一区二区三区的介绍| bt7086福利一区国产| 99久久综合网| 蜜乳av一区二区| 日韩精品一区二区三区久久| 欧美女人交a| 午夜免费电影一区在线观看| 2023国产精华国产精品| 国产欧美精品久久久| 欧美成人精品一区二区男人小说| 久久免费高清视频| 天堂av在线电影| 久久精品99久久久久久久久| 国产51人人成人人人人爽色哟哟| 欧美精品一区二区三区在线| 精品人妻aV中文字幕乱码色欲| 欧美性猛交xxxx黑人交| 国产在线一区视频| 亚洲视频一区二区在线| 最新日韩免费视频| 国产精品久久一卡二卡| ass极品国模人体欣赏| 久久精品网站免费观看| wwwwww日本| 久久精品在线免费观看| 亚洲国产av一区| 久久综合九色综合欧美就去吻 | 三级在线免费看| 午夜在线a亚洲v天堂网2018| 欧美a在线视频| 亚洲第一黄色| 免费不卡av在线| 在线播放日韩| 免费看又黄又无码的网站| 99视频精品| 和岳每晚弄的高潮嗷嗷叫视频| 黄色欧美日韩| 国产精品无码一区二区在线| 99riav国产精品| 国产熟女高潮视频| 久久久久久久欧美精品| 精品少妇一区二区三区在线| 国产农村妇女毛片精品久久莱园子 | 免费av网站在线看| 欧美成人精品一区二区三区| 在线黄色网页| 九色91av视频| 成全电影大全在线观看| 91sa在线看| 18video性欧美19sex高清| 97超级碰碰碰久久久| 天堂电影一区| 国产欧美精品一区二区| 国产一区影院| 999在线免费观看视频| 日本一道高清一区二区三区| 日韩高清国产精品| 国产精品毛片久久| 丁香婷婷综合激情| 奶水喷射视频一区| heyzo亚洲| 中文欧美日韩| 在线观看国产中文字幕| 久久成人18免费观看| 国产精欧美一区二区三区白种人| 国产精品影音先锋| 泷泽萝拉在线播放| 最新国产の精品合集bt伙计| 国产67194| 欧美性jizz18性欧美| 在线免费av网| 亚洲第一页在线| av色图一区| 欧美激情伊人电影 | 欧美日韩中文字幕在线| 高潮毛片又色又爽免费 | 国产又爽又黄的激情精品视频| 日韩三级av高清片| 欧美另类网站| 最新国产精品| 免费在线黄网站| 日本vs亚洲vs韩国一区三区二区 | 国内自拍视频网| 东方欧美亚洲色图在线| 美女100%露胸无遮挡| 午夜电影一区二区三区| 91在线观看喷潮| 亚洲第一区中文99精品| 精品孕妇一区二区三区| 欧美亚洲一区在线| 美女精品视频在线| 欧美一区二区福利| 外国成人激情视频| 一本久道综合色婷婷五月| 狠狠狠色丁香婷婷综合久久五月| 国产成人无码一区二区在线观看| 亚洲人成精品久久久久| 精品无码一区二区三区的天堂| 亚洲成人av在线播放| 麻豆传媒视频在线| 国产97在线|日韩| 九九热hot精品视频在线播放| 宅男噜噜99国产精品观看免费| 性欧美暴力猛交另类hd| 国产69视频在线观看| 欧美极品aⅴ影院| 亚洲男人的天堂在线视频| 精品乱码亚洲一区二区不卡| 午夜在线观看视频| 欧美中文字幕在线观看| av国产精品| 亚洲高清视频一区二区| 天天干中文字幕| 一区二区三区精品在线观看| 啪啪小视频网站| 日韩精品视频在线观看免费| 免费看电影在线| 91色p视频在线| 久久精品99久久无色码中文字幕| 精品福利久久久| 91精品视频免费| 青青草国产免费一区二区下载 | 精品国产一区在线| 亚洲精品久久嫩草网站秘色| 激情网站五月天| 麻豆成人综合网| 中文字幕一区二区三区人妻不卡| 亚洲v日本v欧美v久久精品| 国产精品久久久久久无人区| www.亚洲一区| 香蕉久久久久久| 在线观看亚洲视频啊啊啊啊| 久久久久国产精品一区三寸| 粉嫩绯色av一区二区在线观看| www国产精品内射老熟女| 国产在线麻豆精品观看| аⅴ天堂中文在线网| 午夜精品123| 香蕉av在线播放| 51ⅴ精品国产91久久久久久| 国产精品久久久久av蜜臀| 嫩呦国产一区二区三区av| 亚洲精品中文字幕在线| 久久精品一本| 91资源在线播放| 精品视频全国免费看| 在线日本视频| 成人免费网视频| 午夜精品剧场| 亚洲图片欧美另类| 亚洲综合一区二区精品导航| www.四虎在线观看| 国内精品一区二区三区四区| 欧美人妖视频| 国产v亚洲v天堂无码久久久| 国产精品尤物福利片在线观看| 久久xxx视频| 亚洲一区美女| 国产一区二区调教| 久久久久亚洲av无码专区体验| 日韩欧美激情一区| 激情黄产视频在线免费观看| 亚洲欧美资源在线| 欧美xx视频| 吴梦梦av在线| 成人听书哪个软件好| 青青视频在线免费观看| 日韩视频免费在线观看| 91精品短视频| 日韩中文字幕免费在线| 亚洲男人的天堂在线观看| 久久99日本精品| 韩国三级在线看| 欧美日韩激情视频8区| 黑人与亚洲人色ⅹvideos| 国产在线视频欧美| 国内精品美女在线观看| 新91视频在线观看| 日韩一区二区三区视频在线| 精精国产xxxx视频在线播放| 色综合久久久久久久久五月| 国产精品夜夜爽| 国产美女www爽爽爽| 久久久久中文字幕2018| 国产欧美日韩视频在线|