精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美三级在线看| 国产精品18久久久久久vr| 亚洲国产精品99久久| 亚洲第一页在线视频| 亚洲卡一卡二卡三| 久久中文精品| 一区二区三区四区精品| 天天操狠狠操夜夜操| 草草视频在线观看| 中文字幕一区二区5566日韩| 国产精品久久精品视| 亚洲高清视频免费观看| 国产精品啊啊啊| 日韩在线小视频| 欧美亚一区二区三区| 麻豆一区在线| 欧美日韩一本到| 免费成人在线视频网站| 精品麻豆一区二区三区| 久久精品亚洲一区二区三区浴池| 99高清视频有精品视频| 亚洲无码精品一区二区三区| 亚洲精品欧美| 九九热精品视频| 黄色av片三级三级三级免费看| 欧美人体视频| 精品久久久久香蕉网| 午夜剧场高清版免费观看 | 久久成人国产精品| 手机毛片在线观看| 九九亚洲精品| 精品呦交小u女在线| 一区二区三区四区影院| 亚洲aⅴ网站| 在线亚洲一区二区| 男人操女人免费软件| 丁香花电影在线观看完整版| 亚洲精品自拍动漫在线| 一级黄色免费在线观看| av在线播放网站| 久久精品欧美一区二区三区麻豆| 精品产品国产在线不卡| 日韩一级片免费| 国产91精品免费| 2020国产精品久久精品不卡| 国产男男gay体育生网站| 开心九九激情九九欧美日韩精美视频电影| 欧美专区在线播放| 久久国产视频播放| 亚洲欧美日韩在线观看a三区| 性欧美办公室18xxxxhd| 国产精品7777777| 99综合在线| 欧美一级片在线播放| 日本在线视频免费| 99成人在线| 欧美中文字幕在线观看| 天堂中文在线网| 久久一本综合频道| 国产高清视频一区三区| 国产精品传媒在线观看| 久久国产麻豆精品| 91社区国产高清| 亚洲爆乳无码一区二区三区| 成人免费黄色大片| 蜜桃传媒视频第一区入口在线看| 欧美精品少妇| 中文字幕免费一区| 综合操久久久| av毛片在线免费看| 亚洲丶国产丶欧美一区二区三区| 免费观看美女裸体网站| 在线免费看h| 欧美色综合久久| 图片区乱熟图片区亚洲| 黑人久久a级毛片免费观看| 日韩精品在线播放| 欧美成人短视频| 午夜欧美视频| 奇米成人av国产一区二区三区| 日韩国产成人在线| 国产经典欧美精品| 美乳视频一区二区| 国产视频中文字幕在线观看| 亚洲一区二区三区四区在线观看| 国产h视频在线播放| 91在线亚洲| 精品久久一区二区三区| 在线小视频你懂的| 欧美精品99| 国产精品久久久久久av| av资源免费看| 久久精品人人做人人综合| 国产内射老熟女aaaa| 天堂中文av在线资源库| 欧美日韩极品在线观看一区| 亚洲激情 欧美| 欧美激情黄色片| 国内久久久精品| 91片黄在线观看喷潮| 91视频在线看| 超碰10000| 欧美日韩女优| 亚洲精品国偷自产在线99热| 免费在线观看a级片| 亚洲一区一卡| 999热视频| 国产日产精品久久久久久婷婷| 亚洲综合区在线| the porn av| 亚洲免费专区| 久久久午夜视频| 99在线观看免费| 国产精品久久久久久久浪潮网站| 男女超爽视频免费播放| 国产精品igao视频网网址不卡日韩 | 欧美疯狂做受xxxx高潮| 在线观看黄色国产| 久久久久久久久免费| 天天夜碰日日摸日日澡性色av| 日韩成人视屏| 麻豆国产精品va在线观看不卡| 欧美成人精品网站| 久久亚洲精品国产精品紫薇| 成人免费观看在线| 日韩在线成人| 久久成人精品电影| 亚洲资源在线播放| 国产亚洲自拍一区| 免费在线观看日韩视频| 欧美天堂影院| 久久久久久久久久国产| 精品国自产在线观看| 亚洲人成影院在线观看| 超碰在线公开97| 日本激情一区| 国产精品日日摸夜夜添夜夜av| 国产日本在线| 欧洲av在线精品| 51妺嘿嘿午夜福利| 日韩精品成人一区二区在线| 日本一区二区久久精品| 精品成人av| 自拍偷拍亚洲区| 亚洲天堂999| 中文字幕一区二区三区视频| 亚洲综合20p| 欧美一区二区三区久久精品茉莉花 | 91精品国产自产精品男人的天堂| 欧美日本中文字幕| 国产91麻豆视频| 亚洲成av人影院| 国产美女喷水视频| 久久在线91| 中文字幕一区二区三区四区五区六区 | 亚洲欧美一区二区三区四区五区| 国产经典欧美精品| 99久久国产综合精品五月天喷水| 欧美久久香蕉| 国产精品高潮粉嫩av| 在线观看av黄网站永久| 91精品国产一区二区三区| 欧美做爰爽爽爽爽爽爽| 国产99久久久精品| 黄色免费观看视频网站| 激情五月色综合国产精品| 国产精品日韩久久久久| 羞羞视频在线免费国产| 亚洲国产成人精品电影| 69国产精品视频免费观看| 亚洲国产精品黑人久久久 | 99re这里只有精品视频首页| 国产黄色特级片| 亚洲国产成人精品女人| 国产亚洲自拍偷拍| h1515四虎成人| 久久99久久99精品免观看粉嫩| 亚洲 国产 欧美 日韩| 在线观看日韩电影| 深夜福利影院在线观看| 久久久久国产精品厨房| 亚洲妇熟xx妇色黄蜜桃| 国产视频久久| 中文字幕综合在线观看| 欧美调教在线| 亚洲va码欧洲m码| 中文在线а√在线8| 亚洲天堂色网站| www.国产黄色| 欧洲视频一区二区| 四虎成人精品永久免费av| 国产精品午夜在线| 亚洲一级Av无码毛片久久精品| 日韩成人精品在线观看| 日本一道在线观看| jizzjizz欧美69巨大| 国产超碰91| 欧美成人黄色| 奇门遁甲1982国语版免费观看高清| 超碰最新在线| 在线观看国产欧美| 色噜噜在线播放| 制服丝袜在线91| 日本中文字幕第一页| 一区二区日韩电影| 大地资源高清在线视频观看| 久久久久久久网| 色哟哟视频在线| 国产一区在线不卡| 一级黄色特级片| 亚洲欧美久久久| 91网站在线观看免费| 天天久久综合| 日韩精品久久一区| 台湾色综合娱乐中文网| 亚洲综合中文字幕68页| 欧洲亚洲精品久久久久| 国产精品27p| 女人高潮被爽到呻吟在线观看| 久久成人国产精品| 欧美成人二区| 深夜福利91大全| 国产在线中文字幕| 国产婷婷成人久久av免费高清| 亚洲欧美强伦一区二区| 欧美一区二区观看视频| 国产精品九九九九| 欧美日韩在线三区| 成人免费一区二区三区| 色噜噜狠狠色综合中国| 午夜影院免费在线观看| 天天亚洲美女在线视频| 日本熟妇毛耸耸xxxxxx| 香蕉成人啪国产精品视频综合网| 欧美毛片在线观看| 一二三区精品视频| 国产又粗又硬又长又爽| 亚洲人成在线观看一区二区| 91 在线视频| 亚洲视频中文字幕| 国产午夜精品理论片在线| 国产精品乱码一区二区三区软件| 亚洲午夜久久久久久久国产| 国产区在线观看成人精品| 娇妻被老王脔到高潮失禁视频| 国产亚洲精品免费| 少妇太紧太爽又黄又硬又爽小说| 国产精品色在线观看| 影音先锋男人看片资源| 国产精品成人一区二区艾草| 久久精品一区二区三区四区五区| 亚洲丝袜精品丝袜在线| 久久久久久av无码免费网站| 亚洲成人1区2区| 中文字幕第15页| 日本久久一区二区三区| 中国精品一区二区| 欧美精品高清视频| 亚洲欧美强伦一区二区| 精品视频在线播放| 北岛玲一区二区三区| 久久手机精品视频| 欧美性video| 欧美专区在线观看| 日韩成人综合网| 91免费版网站在线观看| 麻豆一区二区| 婷婷精品国产一区二区三区日韩| 天天综合网91| 国产精品无码人妻一区二区在线| 一区二区三区精品视频在线观看| 日本女优爱爱视频| 国产真实乱子伦精品视频| 国产精品成人免费一区久久羞羞| 91麻豆福利精品推荐| 国产黄色录像视频| 亚洲午夜视频在线| 欧美日韩a v| 日韩女优毛片在线| 男同在线观看| 欧美成年人在线观看| 中日韩脚交footjobhd| 成人性生交大片免费看小说| 欧美日韩大片免费观看| 一本色道久久综合亚洲精品婷婷| 国产精品99一区二区| 午夜视频在线瓜伦| 国产不卡一区视频| 成人在线观看免费高清| 亚洲国产精品一区二区久久| 波多野结衣大片| 精品99久久久久久| 免费观看久久久久| 欧美亚洲视频在线观看| 高清一区二区三区av| 欧美凹凸一区二区三区视频 | 中文字幕在线观看不卡视频| 日韩精品视频免费看| 在线观看91av| 精品无吗乱吗av国产爱色| 久久91精品国产| 久久精品资源| 欧洲国产精品| 亚洲黄色精品| 色哟哟免费视频| 国产精品女主播在线观看| 可以免费看的av毛片| 欧美成人一级视频| 久操视频在线播放| 国产精品久久久久久超碰| 少妇久久久久| 老子影院午夜伦不卡大全| 久久99国产精品久久| 天堂久久精品忘忧草| 欧美日韩美女视频| 亚洲av无码乱码国产精品| 操91在线视频| 亚洲精品大全| 杨幂一区欧美专区| 日韩国产在线观看| 91精品人妻一区二区| 激情成人中文字幕| 污污网站在线免费观看| 欧美贵妇videos办公室| 久久国产精品美女| 日本黄色播放器| 韩国午夜理伦三级不卡影院| 调教驯服丰满美艳麻麻在线视频 | 91po在线观看91精品国产性色| 麻豆精品久久| 成人黄色片免费| 国产高清不卡二三区| 侵犯稚嫩小箩莉h文系列小说| 欧美美女激情18p| 精品视频在线一区二区| av欧美精品.com| 国产福利片一区二区| 日本欧美一区二区| 亚洲精品色午夜无码专区日韩| 福利二区91精品bt7086| 深爱激情五月婷婷| 性欧美视频videos6一9| 欧美1区2区3区4区| 日韩av三级在线| 91丨porny丨在线| jizz国产在线观看| 尹人成人综合网| 波多野结衣在线免费观看| 亚洲手机成人高清视频| 99国产精品久久久久久久成人| 久色乳综合思思在线视频| 欧州一区二区三区| av在线观看地址| 26uuu色噜噜精品一区二区| 黄色av一级片| 日韩在线视频观看正片免费网站| 精品欧美视频| 国产精品入口芒果| 久久婷婷成人综合色| 日韩乱码一区二区三区| 欧美xxxx做受欧美| 成人性生交大片免费看96| 国产人妻777人伦精品hd| 久久久久久久精| 一级黄色a毛片| 久久久久久国产精品三级玉女聊斋| 国内精品免费| 日本美女高潮视频| 国产成人三级在线播放| 中文字幕国产亚洲| 看片一区二区| 91大学生片黄在线观看| 不卡一卡二卡三乱码免费网站| av大片免费观看| 自拍偷拍免费精品| 第四色在线一区二区| 国产精品久久久久9999小说| 成人免费一区二区三区在线观看| 欧美少妇bbw| 国产精品一区二区三区成人| 午夜激情一区| 日韩av在线看免费观看| 欧美一级片免费看| jizz内谢中国亚洲jizz| 欧美xxxx吸乳| 久久网站热最新地址| 国产手机av在线| 99精品人妻无码专区在线视频区| 亚洲福利在线视频| 九九九伊在线综合永久| 成年人深夜视频| 亚洲国产成人午夜在线一区 | 丁香花在线电影| 色涩成人影视在线播放| 国产 欧美在线| 中文字幕av影视| 欧美性在线观看| 午夜久久99| 成年人看的免费视频| 日韩av综合网站|