日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

解決SpringBoot使用devtools導致的類型轉換異常問題

瀏覽:139日期:2023-05-01 08:37:05

問題:

最近在使用新框架SpringBoot + shiro + spring-data-jpa時,為了體驗下spring自帶的熱部署工具的便捷,于是引入了

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <!-- optional=true,依賴不會傳遞,該項目依賴devtools;之后依賴myboot項目的項目如果想要使用devtools,需要重新引入 --> <optional>true</optional> </dependency>

在起初并沒遇到什么問題,當使用shiro的session管理,而且用的sessionDao是redis實現的,然后再使用Session存取屬性時,發現存進去的屬性,再取出來后,就會出現類型轉換異常ClassCastException

分析:

然后自己寫了一大推單元測試模擬就是沒問題,后來突然意識到會不會是因為ClassLoader不同導致的類型轉換異常呢,然后注意了下項目啟動時加載項目中的類使用的加載器都是

org.springframework.boot.devtools.restart.classloader.RestartClassLoader

而從shiro session 取出來的對象(從redis中取出經過反序列化)的類加載器都是

sun.misc.Launcher.AppClassLoader

很明顯會導致類型轉換異常,原來Spring的dev-tools為了實現重新裝載class自己實現了一個類加載器,來加載項目中會改變的類,方便重啟時將新改動的內容更新進來,其實其中官方文檔中是有做說明的:

By default, any open project in your IDE will be loaded using the “restart” classloader, and any regular .jar file will be loaded using the “base” classloader. If you work on a multi-module project, and not each module is imported into your IDE, you may need to customize things. To do this you can create a META-INF/spring-devtools.properties file. The spring-devtools.properties file can contain restart.exclude. and restart.include. prefixed properties. The include elements are items that should be pulled up into the “restart” classloader, and the exclude elements are items that should be pushed down into the “base” classloader. The value of the property is a regex pattern that will be applied to the classpath.

解決:

方案一、解決方案就是在resources目錄下面創建META-INF文件夾,然后創建spring-devtools.properties文件,文件加上類似下面的配置:

restart.exclude.companycommonlibs=/mycorp-common-[w-]+.jar restart.include.projectcommon=/mycorp-myproj-[w-]+.jar

All property keys must be unique. As long as a property starts with restart.include. or restart.exclude. it will be considered. All META-INF/spring-devtools.properties from the classpath will be loaded. You can package files inside your project, or in the libraries that the project consumes.

方案二、不使用spring-boot-devtools

針對方案一作一個詳細的案例進行分析說明,以及解決問題

首先準備一個jar包,里面包含序列化以及反序列化的功能。

并打包,在springboot項目中引入

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId></dependency><!-- 這個包是我自己創建的序列化以及反序列化工具包 --><dependency> <groupId>com.example</groupId> <artifactId>devtools-serialization</artifactId> <version>1.0-SNAPSHOT</version></dependency>

簡單的配置下springboot項目,并模擬使用jar中的序列化工具類進行處理對象如下

@SpringBootApplicationpublic class PortalApplication { public static void main(String[] args) throws Exception { ConfigurableApplicationContext context = SpringApplication.run(PortalApplication.class, args); DemoBean demoBean = new DemoBean(); SerializationUtils.serialize(demoBean); Object deserialize = SerializationUtils.deserialize(); System.out.println(PortalApplication.class.getClassLoader()); //這里對象引用是Object類型 System.out.println(deserialize); System.out.println(deserialize.getClass().getClassLoader()); context.getBeanFactory().destroySingletons(); }}

如上,是不會報錯的,因為Object是bootstrap引導類加載器加載的,因此不會產生任何問題,

但是如果改成下面這樣

//... public static void main(String[] args) throws Exception { ConfigurableApplicationContext context = SpringApplication.run(PortalApplication.class, args); DemoBean demoBean = new DemoBean(); SerializationUtils.serialize(demoBean); Object deserialize = SerializationUtils.deserialize(); System.out.println(PortalApplication.class.getClassLoader()); //注意這里進行了一次類型強轉 System.out.println((DemoBean)deserialize); System.out.println(deserialize.getClass().getClassLoader()); context.getBeanFactory().destroySingletons(); } //...

結果是會拋出:

Exception in thread 'restartedMain' java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) Caused by: java.lang.ClassCastException: com.sample.serial.DemoBean cannot be cast to com.sample.serial.DemoBean at com.sample.PortalApplication.main(PortalApplication.java:27) ... 5 more

而觀察上面輸出的ClassLoader信息會發現分別為

org.springframework.boot.devtools.restart.classloader.RestartClassLoader@63059d5a sun.misc.Launcher$AppClassLoader@18b4aac2

這就是為什么會明明沒問題,卻仍然拋了個ClassCastException的根源所在。

那么如何解決這個問題呢?

將輸出的ClassLoader信息保持一致即可,要么都是RestartClassLoader要么都是

AppClassLoader

這里參考spring官方文檔給出的配置方法進行處理。

在resources下創建META-INF/spring-devtools.properties

如圖:

解決SpringBoot使用devtools導致的類型轉換異常問題

下一步在spring-devtools.properties添加配置

restart.include.projectcommon=/devtools-serialization-[w.-]+.jar

注意這里我需要包含的jar包名稱為devtools-serialization-1.0-SNAPSHOT.jar

配置的key以restart.include.開頭即可

restart.include.*

value 為一個正則表達式

下面再次運行程序查看效果:

沒有異常產生

控制臺輸出classLoader信息為

org.springframework.boot.devtools.restart.classloader.RestartClassLoader@1d9fbdd4 DemoBean{age=null, name=’null’} org.springframework.boot.devtools.restart.classloader.RestartClassLoader@1d9fbdd4

問題完美解決。

補充知識:Springboot+devtools配置熱部署

Spring Boot提供了spring-boot-devtools這個模塊來使應用支持熱部署,可以提高開發者的開發效率,無需手動重啟Spring Boot應用就能實現自動加載,之前寫了一篇可以自動加載springboot靜態文件的,這次的只需要在原來的基礎上再加一些配置即可實現springboot工程的熱部署,步驟如下:

1、pom文件增加依賴:

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency></dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration><fork>true</fork> <!--重要--> </configuration> </plugin> </plugins></build>

2、yml文件中添加配置使其生效:

# devtoolsdebug: truespring: devtools: restart: enabled: true #設置開啟熱部署 freemarker: cache: false #頁面不加載緩存,修改即時生效

3、快捷鍵:Ctrl+Alt+S

解決SpringBoot使用devtools導致的類型轉換異常問題

4、快捷鍵:Ctrl+Shift+A,輸入Registry,點擊進入勾選:

解決SpringBoot使用devtools導致的類型轉換異常問題

以上這篇解決SpringBoot使用devtools導致的類型轉換異常問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久久精品久久久久久96| 亚洲专区视频| 红桃视频国产一区| 在线天堂中文资源最新版| 国产精品videosex极品| 三级亚洲高清视频| 米奇777超碰欧美日韩亚洲| 综合日韩av| 国语精品一区| 在线亚洲精品| 国产一区二区三区四区| 国产精品一级| 久久精品 人人爱| 日韩黄色免费网站| 日韩av电影一区| 日韩av资源网| 日本午夜精品| 91精品国产自产精品男人的天堂| 亚洲我射av| 日韩中文字幕不卡| 免费精品视频| 免费日韩精品中文字幕视频在线| 在线一区免费| 伊人成人网在线看| 人人精品亚洲| 欧美日韩精品免费观看视完整| 亚洲一区资源| 少妇久久久久| 国产亚洲在线观看| 免费中文字幕日韩欧美| 鲁大师影院一区二区三区| 亚洲欧美日韩国产综合精品二区 | 久久中文字幕av一区二区不卡| 亚洲午夜天堂| 欧美日韩免费看片| 日韩欧美二区| 欧美日韩国产亚洲一区| 久久亚洲色图| 日韩制服丝袜av| 亚洲毛片一区| 91麻豆精品激情在线观看最新| 国产亚洲精品精品国产亚洲综合| 国产精品男女| 久久精品免视看国产成人| 久久亚洲黄色| www.com.cn成人| 婷婷综合激情| 日韩精品免费视频人成| 国产伦精品一区二区三区视频| 国产精品亚洲综合久久| 国产一区国产二区国产三区| 欧美xxxx中国| 亚洲二区视频| 亚洲综合中文| 欧美激情亚洲| 久久精品亚洲欧美日韩精品中文字幕| 国产精品毛片在线| 国产毛片一区二区三区| 日韩啪啪电影网| 日韩影院免费视频| 亚洲九九精品| 久久精品福利| 成人久久一区| 亚洲日本在线观看视频| 欧美日韩视频免费看| 久久精品理论片| 亚洲自啪免费| 欧美国产另类| 成人av二区| 国产精品亚洲成在人线| 久久精品导航| 久久国产三级精品| 夜鲁夜鲁夜鲁视频在线播放| 自拍自偷一区二区三区| 国产成人久久精品一区二区三区| 亚洲精品888| 国产乱码精品一区二区三区四区| 国产在线|日韩| 首页亚洲欧美制服丝腿| 免费日韩一区二区三区| 免费欧美一区| 久久精品国产精品亚洲毛片| 午夜一级在线看亚洲| 国产精品成人a在线观看| 天使萌一区二区三区免费观看| 久久精品国产亚洲aⅴ| 久久www成人_看片免费不卡| 狠狠久久伊人| 亚洲精品进入| 亚洲高清久久| 精品国产乱码久久久| 日本不卡不码高清免费观看 | 日韩精品免费一区二区夜夜嗨| 亚洲成人不卡| 精品理论电影在线| 日韩av在线免费观看不卡| 欧美精品一卡| 中文另类视频| 精品美女在线视频| 国产午夜精品一区在线观看| 久久亚洲国产精品一区二区| 国产字幕视频一区二区| 国产白浆在线免费观看| 国产精品久久久久久模特| 亚洲午夜国产成人| 久久人人88| 精品国产精品久久一区免费式 | 国产传媒av在线| 久久的色偷偷| 国产欧美日韩视频在线 | 国产精品久久久久77777丨 | 国产精品久久777777毛茸茸| 免费视频最近日韩| 91九色精品| 激情久久久久久| 免费亚洲一区| 国产伦理一区| 久久国产精品免费一区二区三区| 老鸭窝毛片一区二区三区| 国产精品精品国产一区二区| 另类欧美日韩国产在线| 国产调教一区二区三区| 日韩1区2区日韩1区2区| 日韩精品一区二区三区中文| 美美哒免费高清在线观看视频一区二区| 亚洲二区视频| 国产综合婷婷| 在线国产一区二区| 欧美午夜不卡| 西西人体一区二区| 2023国产精品久久久精品双| 久久久久91| 97精品国产| 日韩天堂在线| 久久精品免费一区二区三区| 久久精品av| 夜夜嗨网站十八久久| 日韩午夜av在线| 老牛国产精品一区的观看方式| 久久不射网站| 日韩亚洲精品在线观看| 日韩一区二区三区精品| 欧美在线不卡| 国产精品a级| 激情久久一区二区| 久久av超碰| 精品一区视频| 日韩免费视频| 午夜视频精品| 亚洲乱码视频| 91精品一区| 免费视频一区二区三区在线观看 | 久久香蕉国产| 黄色亚洲精品| 国产一精品一av一免费爽爽| 国产成人免费| 亚洲五月婷婷| 久久国产福利| 国产精品网址| 日本不良网站在线观看| 亚州av乱码久久精品蜜桃| 日本亚洲视频在线| 欧美亚洲色图校园春色| 国精品产品一区| 欧美特黄一区| 日韩三级精品| 久草免费在线视频| 怡红院精品视频在线观看极品| 亚洲啊v在线免费视频| 久久中文字幕一区二区| 激情综合亚洲| 国产欧美高清视频在线| 精品一区91| 国产一区导航| 久久久久九九精品影院| 久久久久.com| 日韩精品免费一区二区夜夜嗨| 99免费精品| 国产精品精品| 国产精品九九| 日韩精品久久久久久| 亚洲综合国产| 久久麻豆精品| 国产福利电影在线播放| 麻豆免费精品视频| 国产日产精品一区二区三区四区的观看方式| 国产在线成人| 久久电影tv| 精品欠久久久中文字幕加勒比| 91精品视频一区二区| 四虎精品一区二区免费| 亚洲在线电影| 精品日韩毛片| 激情综合亚洲| 久久视频精品| 国产综合亚洲精品一区二| 久久精选视频| 亚洲www啪成人一区二区| 国产不卡av一区二区| 国产一区福利|