国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

SpringBoot 使用轉(zhuǎn)換器將前端參數(shù)轉(zhuǎn)換為枚舉

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

[[421671]]

前言

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

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

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

1實(shí)現(xiàn)過程

配置轉(zhuǎn)換器

  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 里實(shí)現(xiàn) addFormatters 方法即可,然后 new 一個 ConverterFactory。

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

就這些,很簡單的實(shí)現(xiàn)。下面介紹下項(xiàng)目的內(nèi)容和代碼,方便理解。

項(xiàng)目代碼

  • 請求參數(shù):
  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("請求參數(shù):{}", 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("返回參數(shù):{}", 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 類型的枚舉。

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

為什么要這么用呢?

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

  • 枚舉
  1. public interface BaseEnum { 
  2.     Object getCode(); 
  1. public enum OrderStatusEnum implements BaseEnum { 
  2.  
  3.     INIT(0, "初始狀態(tài)"), 
  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,所有的枚舉都繼承這個接口,并實(shí)現(xiàn) getCode 方法。

@EnumValue:MyBatis-Plus 的枚舉,和數(shù)據(jù)庫字段映射用的

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

這樣就可以實(shí)現(xiàn)效果,請求參數(shù)為數(shù)字,接收對象字段為枚舉,返回字段也是 code。

效果

測試結(jié)果

測試結(jié)果經(jīng)過驗(yàn)證,是可以勝任傳入數(shù)值和字符串的。

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

具體說明

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

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

在 ConverterFactory 的 getConverter 方法則需要返回一個實(shí)際的轉(zhuǎn)換器 Converter

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

convert 方法的入?yún)⑹且粋€ source,就是要轉(zhuǎn)換為什么類型的,這里就是數(shù)字/字符串,然后返回一個枚舉即可。

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

2優(yōu)化

一般 WebConfig 中除了實(shí)現(xiàn) addFormatters 方法外,還會實(shí)現(xiàn) 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校驗(yàn) 
  22.         registry.addInterceptor(appTokenInterceptor) 
  23.                 .addPathPatterns("/app/**"); 
  24.  
  25.     } 
  26.  
  27.     @Override 
  28.     public void addFormatters(FormatterRegistry registry) { 
  29.          
  30.         // 枚舉轉(zhuǎn)換 
  31.         registry.addConverterFactory(enumConverterFactory); 
  32.     } 

這種就需要咱們創(chuàng)建 EnumConverterFactory 類并實(shí)現(xiàn) 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總結(jié)

當(dāng)然這里也有一些其他的優(yōu)化點(diǎn),比如可以使用緩存將 Convert 緩存起來。

 

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

 

責(zé)任編輯:武曉燕 來源: 程序員小航
相關(guān)推薦

2013-06-13 15:10:27

.NET代碼轉(zhuǎn)換

2010-06-10 14:44:33

協(xié)議轉(zhuǎn)換器

2010-06-10 14:33:03

協(xié)議轉(zhuǎn)換器

2010-06-10 14:38:30

協(xié)議轉(zhuǎn)換器

2010-06-10 15:03:13

協(xié)議轉(zhuǎn)換器

2014-05-04 12:51:21

Javascript編譯器

2019-07-30 10:51:45

Markdown格式化文檔Linux

2023-05-05 00:19:22

2023-08-25 14:47:56

TransFLACFLAC

2018-03-23 09:29:56

深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)前端設(shè)計(jì)模型

2009-12-28 13:38:35

WPF類型轉(zhuǎn)換器

2009-06-17 11:31:23

Open XMLUOF文檔

2021-05-05 10:06:09

React應(yīng)用程序微前端

2010-06-10 14:49:07

協(xié)議轉(zhuǎn)換器

2009-09-11 12:41:41

C#類型轉(zhuǎn)換

2024-05-29 08:12:55

接口參數(shù)格式

2023-08-26 16:06:10

COBOLJava數(shù)據(jù)

2009-07-15 16:56:59

Jython類型Java類型

2010-06-17 23:31:35

協(xié)議轉(zhuǎn)換器

2024-08-23 08:57:13

PyTorch視覺轉(zhuǎn)換器ViT
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

日韩欧美视频一区二区| 91久久国产精品| 福利视频在线播放| 欧美国产在线观看| 日本不卡一区| 雨宫琴音一区二区在线| 日本a级片电影一区二区| 亚洲伊人精品酒店| 亚洲人a成www在线影院| 日韩av激情| 日韩午夜小视频| 加勒比一区二区三区在线| 亚洲免费观看视频| 国产又粗又长又大的视频| 粉嫩aⅴ一区二区三区四区五区 | 最后生还者第二季在线观看| 亚洲国产岛国毛片在线| 一区二区在线播放视频| 久久久久综合网| 欧美a在线视频| 91美女福利视频| 久久久久久久中文| 99久久综合99久久综合网站| 2018国产在线| 亚洲国产精品激情在线观看| 日本xxxxxx| 欧美日韩国产黄| 精品999视频| 精品国产免费人成电影在线观看四季 | 日韩精品视频在线观看视频| 国产成人精品1024| 欧美 日韩 亚洲 一区| 国产成人av在线影院| 成年人午夜免费视频| 91视频国产资源| 日韩中文字幕a| 无码av免费一区二区三区试看| 一级片在线播放| 欧美日韩精品免费| 3344国产永久在线观看视频| 中文字幕亚洲字幕| 成人另类视频| 成人中文字幕+乱码+中文字幕| 亚洲国产日韩在线| 免费看av软件| 国产亚洲欧美日韩俺去了| 国产.com| 欧美一级视频精品观看| 在线天堂资源| 日韩一区二区在线视频| 另类在线视频| av成人在线电影| 久久精品久久久精品美女| 久久福利一区二区| 日韩毛片精品高清免费| yw视频在线观看| 亚洲午夜激情免费视频| 无码少妇一区二区三区| www.成人av| 国产一区二区三区精品视频| 亚洲一区在线不卡| 日本福利一区二区| 婷婷六月国产精品久久不卡| 国产精品爱久久久久久久| 日韩va欧美va亚洲va久久| 校园春色 亚洲色图| 欧美日韩一区二区三区在线看| 高清欧美日韩| 丁香五月网久久综合| 成人免费高清在线观看| 清纯唯美亚洲色图| 在线播放亚洲激情| 欧美在线91| 久久久久久久久久网| 日韩欧美在线字幕| 亚洲伦理网站| 韩国成人一区| 成人欧美一区二区三区白人| 欧美寡妇性猛交xxx免费| 欧美一区二区色| 久久99精品久久久久久久久久久久| 黄色网址三级| 色狠狠av一区二区三区香蕉蜜桃| 你懂的亚洲视频| 国产精品视频黄色| 亚洲国产精彩中文乱码av在线播放| 亚洲a级精品| 日韩亚洲欧美视频| 欧美三级韩国三级日本一级| 欧美毛片免费观看| 可以在线看黄的网站| 91国内精品野花午夜精品| 亚洲码欧美码一区二区三区| 日韩精品久久一区| 天天亚洲美女在线视频| 色妞ww精品视频7777| 一级特黄录像免费播放全99| 成人三级黄色免费网站| 综合激情成人伊人| 羞羞的网站在线观看| 国产成人av网| 国产精品99久久久久久宅男| 久久精品国产亚洲a∨麻豆| 国产婷婷成人久久av免费高清 | 亚洲欧美偷拍另类a∨色屁股| 国产乱妇乱子在线播视频播放网站| 欧美中在线观看| 成人黄色av网站在线| 在线观看午夜av| 91久久久亚洲精品| 亚洲欧美偷拍另类a∨色屁股| 自拍偷拍亚洲图片| 四虎4hu永久免费入口| 91精品国产一区二区三区| 99久久夜色精品国产亚洲1000部| 国产色视频在线播放| 久久久成人av| 国产老妇另类xxxxx| 性欧美videoshd高清| 国产99在线免费| 精品久久中文字幕久久av| 日韩极品在线| 三级免费网站| 97久久精品人搡人人玩 | 日本中文不卡| 67194成人在线观看| 国产精品99一区二区| 男人的天堂在线免费视频| 国产日韩中文字幕| 亚洲女女做受ⅹxx高潮| 少妇一区二区三区| 国产精品入口免费软件| 久久国产精品久久久久久| 国产不卡免费视频| 另类中文字幕国产精品| 成人在线播放网址| 中文字幕av日韩| 国产不卡在线视频| 成人久久网站| 37pao成人国产永久免费视频| 欧美成人免费全部| 国产欧美日韩在线观看| 日韩中文字幕一区二区高清99| 国产一区二区在线免费播放| 91精品国产99久久久久久| 一区二区三区国产| 亚洲精品久久| 国产黄大片在线观看画质优化| 青娱乐国产91| 日韩精品久久久久| 99精品偷自拍| 欧美成人一区在线观看| h动漫在线视频| 极品校花啪啪激情久久| 欧美成人猛片aaaaaaa| 国产成人精品免费视频网站| 欧美三级一区| 成全视频在线播放大地| 国产主播精品在线| 色播五月激情综合网| 欧美亚洲免费| 日韩中文在线播放| 男人艹女人网站| 99久久免费国| 亚洲欧美国产精品| 中文字幕不卡在线观看| 成年人看的毛片| 欧美黑人国产人伦爽爽爽| 亚洲一区在线观看网站| 亚洲免费一区二区| 成人看片在线观看| 毛葺葺老太做受视频| 91精品中文在线| 亚洲精品电影网| 国产日韩欧美不卡| 国产一区二区三区四区三区四 | 欧美日韩一区小说| 国产成人精品aa毛片| 林ゆな中文字幕一区二区| 五月天婷婷在线视频| 黄色免费视频大全| 亚洲一区二区三区香蕉| 亚洲精品在线看| 亚洲国产精品一区二区www在线 | 欧美二区在线| 欧美极度另类性三渗透| 欧美中文字幕不卡| 成人免费毛片a| 久久人人99| 国产剧情av在线播放| 国产免费视频| 欧美二区在线看| 欧美精品成人在线| 欧美日韩高清不卡| 亚洲国产精品成人久久综合一区| 99精品小视频| 2019中文亚洲字幕| 日本中文字幕伦在线观看| 青青草原av在线播放| 精品欧美国产一区二区三区不卡|