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

Springboot強(qiáng)大的類型轉(zhuǎn)換功能,你必須要掌握

開發(fā) 前端
Spring3引入了一個core.convert包,它提供了一個通用類型轉(zhuǎn)換系統(tǒng)。系統(tǒng)定義一個SPI來實(shí)現(xiàn)類型轉(zhuǎn)換邏輯,定義一個API來在運(yùn)行時執(zhí)行類型轉(zhuǎn)換。

[[430214]]

環(huán)境:Springboot2.4.11

Spring3引入了一個core.convert包,它提供了一個通用類型轉(zhuǎn)換系統(tǒng)。系統(tǒng)定義一個SPI來實(shí)現(xiàn)類型轉(zhuǎn)換邏輯,定義一個API來在運(yùn)行時執(zhí)行類型轉(zhuǎn)換。在Spring容器中,你可以使用此系統(tǒng)作為PropertyEditor實(shí)現(xiàn)的替代方案,將外部化的bean屬性值字符串轉(zhuǎn)換為所需的屬性類型。你還可以在應(yīng)用程序中需要進(jìn)行類型轉(zhuǎn)換的任何位置使用公共API。

Converter SPI

實(shí)現(xiàn)類型轉(zhuǎn)換邏輯的SPI是簡單且強(qiáng)類型的,如以下接口定義所示:

  1. package org.springframework.core.convert.converter; 
  2. public interface Converter<S, T> { 
  3.   T convert(S source); 

要創(chuàng)建自己的轉(zhuǎn)換器,需要實(shí)現(xiàn)converter接口,并將S參數(shù)化為要轉(zhuǎn)換的類型,將T參數(shù)化為要轉(zhuǎn)換的類型。如果需要將S的集合或數(shù)組轉(zhuǎn)換為T的集合或集合,還可以透明地應(yīng)用這樣的轉(zhuǎn)換器,前提是同時注冊了委托數(shù)組或集合轉(zhuǎn)換器(默認(rèn)情況下,DefaultConversionService會這樣做)。

對于每個轉(zhuǎn)換調(diào)用,保證源參數(shù)source不為null。如果轉(zhuǎn)換失敗,轉(zhuǎn)換器可能會拋出任何未檢查的異常。具體來說,它應(yīng)該拋出IllegalArgumentException以報告無效的源值。注意確保轉(zhuǎn)換器實(shí)現(xiàn)是線程安全的。

為了方便起見,core.convert.support包中提供了幾種轉(zhuǎn)換器實(shí)現(xiàn)。其中包括從字符串到數(shù)字和其他常見類型的轉(zhuǎn)換器。下表顯示了StringToInteger類,它是典型的轉(zhuǎn)換器實(shí)現(xiàn):

  1. package org.springframework.core.convert.support; 
  2. final class StringToInteger implements Converter<String, Integer> { 
  3.   public Integer convert(String source) { 
  4.     return Integer.valueOf(source); 
  5.   } 

使用ConverterFactory

當(dāng)需要集中整個類層次結(jié)構(gòu)的轉(zhuǎn)換邏輯時(例如,從字符串轉(zhuǎn)換為枚舉對象時),可以實(shí)現(xiàn)ConverterFactory,如下例所示:

  1. package org.springframework.core.convert.converter; 
  2. public interface ConverterFactory<S, R> { 
  3.   <T extends R> Converter<S, T> getConverter(Class<T> targetType); 

將S參數(shù)化為要轉(zhuǎn)換的類型,將R參數(shù)化為定義可轉(zhuǎn)換為的類范圍的基類型。然后實(shí)現(xiàn)getConverter(類),其中T是R的一個子類。

以StringToEnumConverterFactory為例:

  1. package org.springframework.core.convert.support; 
  2.  
  3. final class StringToEnumConverterFactory implements ConverterFactory<String, Enum> { 
  4.  
  5.   public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) { 
  6.     return new StringToEnumConverter(targetType); 
  7.   } 
  8.   private final class StringToEnumConverter<T extends Enum> implements Converter<String, T> { 
  9.  
  10.     private Class<T> enumType; 
  11.  
  12.     public StringToEnumConverter(Class<T> enumType) { 
  13.       this.enumType = enumType; 
  14.     } 
  15.  
  16.     public T convert(String source) { 
  17.       return (T) Enum.valueOf(this.enumType, source.trim()); 
  18.     } 
  19.   } 

自定義類型轉(zhuǎn)換

現(xiàn)在需要將接受的字符串轉(zhuǎn)換為Users對象

  1. public class Users { 
  2.   private String name ; 
  3.   private Integer age ; 

接口

  1. @GetMapping("/convert2"
  2. public Object convert2(Users users) { 
  3.   return users ;  

調(diào)用接口

Springboot強(qiáng)大的類型轉(zhuǎn)換功能你必須要掌握

如上,通過get方式users的參數(shù)通過逗號分割。接下來就是寫類型轉(zhuǎn)換器了。

  1. @SuppressWarnings({"rawtypes""unchecked"}) 
  2. public class UsersConverterFactory implements ConverterFactory<String, Users> { 
  3.  
  4.   @Override 
  5.   public <T extends Users> Converter<String, T> getConverter(Class<T> targetType) { 
  6.     return new StringToUsersConverter() ; 
  7.   } 
  8.      
  9.   private final class StringToUsersConverter<T extends Users> implements Converter<String, Users> { 
  10.     public Users convert(String source) { 
  11.       if (source == null || source.trim().length() == 0) { 
  12.         return null ; 
  13.       } 
  14.       Users user = new Users() ; 
  15.       // 下面做簡單處理,不做校驗(yàn) 
  16.       String[] values = source.split(",") ; 
  17.       user.setName(values[0]) ; 
  18.       user.setAge(Integer.parseInt(values[1])); 
  19.       return user ; 
  20.     } 
  21.   } 

 注冊類型轉(zhuǎn)換器

  1. @Configuration 
  2. public class WebConfig implements WebMvcConfigurer { 
  3.  
  4.   @Override 
  5.   public void addFormatters(FormatterRegistry registry) { 
  6.     registry.addConverterFactory(new UsersConverterFactory()) ; 
  7.   } 
  8.      

編程方式使用類型轉(zhuǎn)換器

要以編程方式使用ConversionService實(shí)例,可以像對任何其他bean一樣向其注入引用。以下示例顯示了如何執(zhí)行此操作:

我們使用系統(tǒng)內(nèi)置的類型轉(zhuǎn)換器:字符串類型轉(zhuǎn)枚舉類型

  1. public enum PayStatus { 
  2.      
  3.   START, PROCESS, COMPLETE 
  4.      
  1. @RestController 
  2. @RequestMapping("/users"
  3. public class UsersController { 
  4.      
  5.   @Resource 
  6.   private ConversionService cs ; 
  7.    
  8.   @GetMapping("/convert"
  9.   public Object convert(String status) { 
  10.     boolean canConvert = cs.canConvert(String.class, PayStatus.class) ; 
  11.     return canConvert ? cs.convert(status, PayStatus.class) : "UNKNOW";  
  12.   } 
  13.    

先判斷是否能夠轉(zhuǎn)換,其實(shí)就是判斷有沒有從source到target的類型轉(zhuǎn)換器存在。

類型轉(zhuǎn)換的實(shí)現(xiàn)原理

以自定義類型轉(zhuǎn)換器為例

SpringMVC在進(jìn)行接口調(diào)用是會執(zhí)行相應(yīng)的參數(shù)解析,確定了參數(shù)解析器后會執(zhí)行轉(zhuǎn)換服務(wù)。

查找參數(shù)解析器

查找合適的HandlerMethodArgumentResolver

  1. public class InvocableHandlerMethod extends HandlerMethod { 
  2.   protected Object[] getMethodArgumentValues(...) throws Exception {   
  3.     // 查找合適的參數(shù)解析器(本例應(yīng)用的是ServletModelAttributeMethodProcessor) 
  4.     if (!this.resolvers.supportsParameter(parameter)) { 
  5.       throw new IllegalStateException(formatArgumentError(parameter, "No suitable resolver")); 
  6.     } 
  7.     try { 
  8.       args[i] = this.resolvers.resolveArgument(parameter, mavContainer, request, this.dataBinderFactory); 
  9.     }       
  10.   } 

解析參數(shù)

執(zhí)行

  1. public class ModelAttributeMethodProcessor implements HandlerMethodArgumentResolver { 
  2.   public final Object resolveArgument(...) { 
  3.     attribute = createAttribute(name, parameter, binderFactory, webRequest);     
  4.   } 
  5. public class ServletModelAttributeMethodProcessor extends ModelAttributeMethodProcessor { 
  6.   protected final Object createAttribute(String attributeName, MethodParameter parameter, WebDataBinderFactory binderFactory, NativeWebRequest request) throws Exception { 
  7.     // 這里得到的是原始值 
  8.     String value = getRequestValueForAttribute(attributeName, request); 
  9.     if (value != null) { 
  10.       Object attribute = createAttributeFromRequestValue(value, attributeName, parameter, binderFactory, request); 
  11.       if (attribute != null) { 
  12.         return attribute; 
  13.       } 
  14.     } 
  15.     return super.createAttribute(attributeName, parameter, binderFactory, request); 
  16.   }   
  17.   protected Object createAttributeFromRequestValue(String sourceValue, String attributeName,MethodParameter parameter, WebDataBinderFactory binderFactory, NativeWebRequest request) throws Exception { 
  18.     DataBinder binder = binderFactory.createBinder(request, null, attributeName); 
  19.     // ConversionService對象是在容器啟動的時候就初始化好的 
  20.     // 在WebMvcAutoConfiguration#mvcConversionService方法中初始化。 
  21.     ConversionService conversionService = binder.getConversionService(); 
  22.     if (conversionService != null) { 
  23.       TypeDescriptor source = TypeDescriptor.valueOf(String.class); 
  24.       TypeDescriptor target = new TypeDescriptor(parameter); 
  25.       // 判斷是否有合適的類型轉(zhuǎn)換器 
  26.       if (conversionService.canConvert(source, target)) { 
  27.         // 此方法中進(jìn)行類型的轉(zhuǎn)換 
  28.         return binder.convertIfNecessary(sourceValue, parameter.getParameterType(), parameter); 
  29.       } 
  30.     } 
  31.     return null
  32.   } 

 

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2019-06-20 17:39:12

Android啟動優(yōu)化

2020-04-08 17:10:03

GitHub代碼開源

2021-12-03 18:04:06

命令 RabbitMQ Web

2018-06-12 15:55:07

編程語言Java加密方式

2019-08-07 15:20:08

Git開源命令

2022-07-24 09:56:40

大數(shù)據(jù)技術(shù)

2019-04-09 08:15:27

SEO優(yōu)化工具網(wǎng)站

2019-08-06 14:54:22

Hadoop數(shù)據(jù)集海量數(shù)據(jù)

2019-12-27 15:05:11

LinuxWindowsDNS

2015-05-07 15:13:22

JS實(shí)現(xiàn)JQueryJQuery

2023-09-13 09:20:00

日志配置Spring

2024-09-13 09:59:27

2010-08-16 09:55:23

DB2數(shù)據(jù)類型

2018-01-31 22:30:05

數(shù)據(jù)科學(xué)家數(shù)據(jù)專家工程師

2018-09-21 11:11:34

備份離線自動

2018-11-08 12:07:38

備份手動磁盤

2018-11-28 10:00:42

React組件前端

2019-05-16 15:35:36

2023-04-26 16:34:12

2019-07-31 09:06:35

Java跳槽那些事兒文章
點(diǎn)贊
收藏

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

日本中文字幕一级片| 国产精品444| 久久久久久久久久影视| sis001亚洲原创区| 久久久久久久久免费| 国产精品网站大全| 久久久久成人网站| 影视先锋久久| 欧美一区二区视频在线观看2022| 国产精品一色哟哟| 成人在线免费看| 国产成人免费视频| 国产精品jizz在线观看麻豆| 免费成人深夜夜行网站| 加勒比色综合久久久久久久久 | 在线观看免费国产视频| 精品一区二区三| 日韩久久精品一区| 在线观看av日韩| 男人天堂亚洲天堂| 中文字幕精品一区| 久久99精品久久久久久秒播放器| 96日本xxxxxⅹxxx17| 一区二区久久| 久久综合88中文色鬼| 老鸭窝一区二区| 日韩精品中文字幕吗一区二区| 日本国产一区二区| 一本久道高清无码视频| 欧美成人精品一区二区男人看| www.欧美色图| 99国产盗摄| 中文字幕制服诱惑| 欧美一级久久| 久久久久久久91| 久久精品在线观看视频| 亚洲另类av| 精品播放一区二区| 亚欧精品在线视频| 久久夜夜久久| 在线观看成人小视频| 免费看又黄又无码的网站| a毛片在线看免费观看| 中文在线资源观看网站视频免费不卡| 久久伦理网站| 天堂在线视频免费| 国产成人综合在线| 91久久精品国产| 在线观看国产精品入口男同| 天堂va蜜桃一区二区三区漫画版| 97在线视频免费| 日本a在线观看| 国语自产精品视频在线看8查询8| 久久精品夜夜夜夜夜久久| 极品蜜桃臀肥臀-x88av| 国产传媒欧美日韩成人精品大片| 亚洲精品一区二区久| www男人天堂| 99ri日韩精品视频| 精品国产污网站| 蜜桃色一区二区三区| 亚洲一区二区三区久久久| 欧美天堂一区二区三区| 国产精品一区二区小说| 免费视频观看成人| 欧美日本一区二区在线观看| 在线观看岛国av| 91国产一区| 日韩一级完整毛片| 老司机免费视频| 欧美一区 二区| 亚洲男人7777| 精品伦精品一区二区三区视频密桃| 欧美亚洲国产激情| 久久伊人精品视频| 国产一级一片免费播放放a| 伊人久久亚洲美女图片| 91av视频在线观看| 69av视频在线观看| 韩国av一区二区三区在线观看| 亚洲一区国产精品| 人妻无码中文字幕| 久久欧美中文字幕| 亚洲欧洲日韩精品| 四虎影视国产在线视频| 天天综合天天做天天综合| 六月激情综合网| 欧美一级网址| 欧美成人午夜电影| 日本黄色网址大全| 97精品中文字幕| 久久久久久久成人| 国产又粗又猛又黄视频| 精品一区二区三区免费毛片爱| 成人做爰66片免费看网站| 三级在线观看| |精品福利一区二区三区| 性一交一乱一伧国产女士spa| 婷婷电影在线观看| 7777精品伊人久久久大香线蕉的| 少妇一级淫免费观看| 日韩电影一区| 国内久久久精品| 在线观看毛片视频| av不卡一区二区三区| 亚洲日本理论电影| 捆绑调教日本一区二区三区| 欧美久久久久久蜜桃| 成人无码www在线看免费| 91视频久久| 国产mv免费观看入口亚洲| 国产婷婷在线视频| 国产日韩精品一区二区三区| 久无码久无码av无码| 丰满少妇一区| 日韩精品中文字幕在线播放| 九九热精彩视频| 麻豆高清免费国产一区| 国内精品久久国产| a视频在线播放| 欧美三级日韩在线| 欧美特黄一区二区三区| 黄色工厂这里只有精品| 国产一区在线播放| 嫩草研究院在线观看| 亚洲网友自拍偷拍| 97人人模人人爽人人澡| 日韩三级在线| 欧美一区深夜视频| 人妻精品一区二区三区| 亚洲欧美另类久久久精品2019| 999精品视频在线| 欧洲亚洲一区二区三区| 欧美美女18p| 国产一区二区女内射| 国产日产精品1区| 国内外成人激情视频| 在线观看视频一区二区三区| 久久九九免费视频| 亚洲一区二区激情| 国产精品妹子av| 黑森林精品导航| 国产一区二区三区网| 18性欧美xxxⅹ性满足| 高h震动喷水双性1v1| 一区二区三区在线看| 日本一二三四区视频| 亚洲mv大片欧洲mv大片| 成人免费激情视频| 黄网站在线免费看| 欧美一区永久视频免费观看| 精品国产视频在线观看| 激情综合网天天干| 国产精品美女在线播放| 伊人久久一区| 久久中文字幕一区| www.亚洲欧美| 亚洲成人av电影在线| 婷婷五月精品中文字幕| 亚洲区一区二| 免费中文日韩| 第四色男人最爱上成人网| 亚洲新中文字幕| 亚洲图片中文字幕| 中文字幕亚洲精品在线观看| www.桃色.com| 午夜精品999| 国产乱人伦精品一区二区| freexxx性亚洲精品| 亚洲精品久久久久久久久久久| 九九精品免费视频| 欧美国产在线观看| 欧美国产在线一区| 在线看片一区| 欧洲一区二区日韩在线视频观看免费 | 五月天激情国产综合婷婷婷| 久久久激情视频| 久久99999| 中文字幕一区二区三三| 国产精品一区二区不卡视频| 欧美日韩电影免费看| x99av成人免费| 成人免费公开视频| 色综合久久综合| 中文字幕无码日韩专区免费| 国产91精品露脸国语对白| 日本福利视频在线| 久久精品国产www456c0m| 99国产超薄丝袜足j在线观看 | 亚洲婷婷在线观看| 日韩精彩视频在线观看| 日本a级片在线观看| 日韩av中文字幕一区| 国产精品永久免费| 欧洲黄色一区| 这里只有精品丝袜| 免费看国产片在线观看| 日本道精品一区二区三区| 日本a级片视频| 久久久久亚洲蜜桃| 可以看的av网址| 丝袜美腿亚洲色图| 欧美激情亚洲天堂| 成人中文在线| 久久99精品国产99久久| 日本免费成人| 欧美亚洲成人网| 里番在线播放| 日韩亚洲精品视频| 神马久久高清| 欧美成人伊人久久综合网| 中文字幕永久在线观看| 亚洲午夜久久久久久久久电影网| 欧美成人短视频| 99免费精品视频| 日本中文字幕在线不卡| 日韩中文字幕亚洲一区二区va在线| 波多野结衣与黑人| 99热国内精品| 日韩片电影在线免费观看| 国产欧美一区二区三区米奇| 成人日韩在线电影| 国产韩日精品| 欧美最近摘花xxxx摘花| 超碰在线网站| 色综合色综合久久综合频道88| 尤物网在线观看| 亚洲午夜小视频| 你懂的在线播放| 日韩国产在线播放| 日本免费不卡视频| 欧美成人乱码一区二区三区| 国产毛片一区二区三区va在线| 欧美在线free| 无码人妻精品一区二区三区9厂 | 成人免费视频91| 欧美福利影院| 亚洲第一综合网站| 97精品视频| 一区二区三区四区欧美| 日韩黄色大片| 亚洲精品9999| 日韩理论在线| 亚洲国产精品久久久久婷婷老年| 国产日产精品_国产精品毛片| 久久国产精品高清| 人人香蕉久久| 久久久久se| 香蕉久久精品日日躁夜夜躁| 精品在线观看一区二区| 欧美调教在线| 欧美一区二区三区四区在线观看地址 | 激情综合久久| 亚洲国产精品无码av| 影音先锋亚洲精品| 欧美日韩在线一| 久久久成人网| 亚洲黄色a v| 久久99精品一区二区三区| 成人综合久久网| 久久99九九99精品| 老司机av网站| av一区二区不卡| 国产精品无码一区二区三区免费 | 中文字幕网站在线观看| 久久久精品影视| 91麻豆制片厂| 亚洲视频一区二区在线| 黄页网站免费观看| 天涯成人国产亚洲精品一区av| 日韩 国产 欧美| 欧美日韩一区二区在线观看| 国产又爽又黄免费软件| 欧美mv日韩mv| 美女欧美视频在线观看免费 | 狠狠干一区二区| 伊甸园亚洲一区| 伊人婷婷久久| 国内精品久久久久久久97牛牛| av之家在线观看| 美女性感视频久久| 女人扒开双腿让男人捅 | 精品一卡二卡三卡四卡日本乱码| 九九视频精品全部免费播放| 伊人av成人| 亚洲第一精品影视| 九九视频精品在线观看| 国产乱子伦视频一区二区三区| 漂亮人妻被黑人久久精品| 国产欧美日韩精品a在线观看| 国产女人18水真多毛片18精品 | 自拍偷拍校园春色| 4hu四虎永久在线影院成人| 亚洲AV无码一区二区三区性| 精品一区二区亚洲| 欧美jizz18hd性欧美| 久久久久久久影院| 免费成人黄色网| 精品婷婷色一区二区三区蜜桃| 成人综合专区| 18禁网站免费无遮挡无码中文| 免费在线观看成人| 中文字幕乱码在线| 亚洲欧美偷拍另类a∨色屁股| 国产精品第9页| 91精品久久久久久久久99蜜臂| 性xxxx搡xxxxx搡欧美| 色偷偷av一区二区三区| 蜜桃麻豆影像在线观看| 成人淫片在线看| 欧美激情在线免费| 妺妺窝人体色777777| 久久精品国内一区二区三区 | 国产精品久久毛片| 美日韩一二三区| 日韩天堂在线观看| 免费在线观看av| 欧美一级在线亚洲天堂| 91精品啪在线观看国产爱臀| 亚洲图片欧洲图片日韩av| 亚洲自啪免费| 久久久老熟女一区二区三区91| 国产精品国产自产拍高清av王其| 国产精品久久久久久99| 精品国一区二区三区| 黄色成人影院| 国产精品免费久久久久影院| 女厕嘘嘘一区二区在线播放 | 欧美一级专区免费大片| 成人不用播放器| 国产成人精品日本亚洲| 欧美日韩一本| 国产爆乳无码一区二区麻豆| 国产在线看一区| 亚洲色图100p| 欧美视频一区二区三区在线观看| 可以在线观看的av| 欧美主播福利视频| 亚洲精华一区二区三区| 91猫先生在线| 99国内精品久久| 日韩特黄一级片| 亚洲护士老师的毛茸茸最新章节| 激情av在线播放| 粉嫩高清一区二区三区精品视频| 综合久久久久| 亚洲丝袜在线观看| 一区二区国产盗摄色噜噜| 99久久久国产精品无码网爆| 久久香蕉频线观| 精品国产一区二区三区性色av| 免费成人进口网站| 国产一区二区三区免费在线观看| 亚洲综合网在线| 日韩丝袜情趣美女图片| 爱情岛亚洲播放路线| 国产精品视频免费一区二区三区| 亚洲国产激情| 少妇光屁股影院| 在线免费一区三区| 午夜视频成人| 亚洲综合小说区| 亚洲国产高清一区| 免费成人蒂法网站| 欧美综合在线视频| 日本蜜桃在线观看| 97久久精品午夜一区二区| 99av国产精品欲麻豆| 亚洲精品视频久久久| 欧美色图片你懂的| 中文在线观看免费| 国产在线一区二区三区四区| 性久久久久久| 国产3级在线观看| 精品国产一区a| 欧美日韩国产v| 91社在线播放| 99久久国产综合精品女不卡| 日本黄色中文字幕| 久久精品中文字幕| 欧美顶级毛片在线播放| 久久久国产欧美| 依依成人精品视频| 日本又骚又刺激的视频在线观看| 国产精品啪视频| 欧美精品福利| 一级片视频免费看| 日韩欧美亚洲国产另类| 亚洲精品一区| 4444在线观看| 久久久久久久久久久电影| 91在线你懂的| 91av视频在线播放| 中文av一区| 国产肥白大熟妇bbbb视频| 这里只有精品视频在线观看| 色网在线免费观看| 中文字幕人成一区| 久久亚洲精精品中文字幕早川悠里| 国产精品福利电影|