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

您的位置:首頁技術(shù)文章
文章詳情頁

解決SpringBoot使用devtools導(dǎo)致的類型轉(zhuǎn)換異常問題

瀏覽:135日期: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>

在起初并沒遇到什么問題,當(dāng)使用shiro的session管理,而且用的sessionDao是redis實現(xiàn)的,然后再使用Session存取屬性時,發(fā)現(xiàn)存進(jìn)去的屬性,再取出來后,就會出現(xiàn)類型轉(zhuǎn)換異常ClassCastException

分析:

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

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

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

sun.misc.Launcher.AppClassLoader

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

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目錄下面創(chuàng)建META-INF文件夾,然后創(chuàng)建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

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

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

并打包,在springboot項目中引入

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

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

@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引導(dǎo)類加載器加載的,因此不會產(chǎn)生任何問題,

但是如果改成下面這樣

//... 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()); //注意這里進(jìn)行了一次類型強轉(zhuǎn) System.out.println((DemoBean)deserialize); System.out.println(deserialize.getClass().getClassLoader()); context.getBeanFactory().destroySingletons(); } //...

結(jié)果是會拋出:

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信息會發(fā)現(xiàn)分別為

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

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

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

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

AppClassLoader

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

在resources下創(chuàng)建META-INF/spring-devtools.properties

如圖:

解決SpringBoot使用devtools導(dǎo)致的類型轉(zhuǎn)換異常問題

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

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

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

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

restart.include.*

value 為一個正則表達(dá)式

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

沒有異常產(chǎn)生

控制臺輸出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這個模塊來使應(yīng)用支持熱部署,可以提高開發(fā)者的開發(fā)效率,無需手動重啟Spring Boot應(yīng)用就能實現(xiàn)自動加載,之前寫了一篇可以自動加載springboot靜態(tài)文件的,這次的只需要在原來的基礎(chǔ)上再加一些配置即可實現(xiàn)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 #設(shè)置開啟熱部署 freemarker: cache: false #頁面不加載緩存,修改即時生效

3、快捷鍵:Ctrl+Alt+S

解決SpringBoot使用devtools導(dǎo)致的類型轉(zhuǎn)換異常問題

4、快捷鍵:Ctrl+Shift+A,輸入Registry,點擊進(jìn)入勾選:

解決SpringBoot使用devtools導(dǎo)致的類型轉(zhuǎn)換異常問題

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

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩一区二区三区在线看| 91欧美极品| 亚洲精品中文字幕乱码| 蜜桃91丨九色丨蝌蚪91桃色| 蜜桃视频免费观看一区| 国产欧美日韩精品一区二区免费 | 国产精品国产一区| 久久国产日本精品| 亚洲字幕久久| 一区二区精品伦理...| 天堂成人国产精品一区| 国产精品一区二区av交换 | 亚洲精品动态| 久久午夜影院| 好看的av在线不卡观看| 久久精品99久久久| 99久久久久久中文字幕一区| 丝袜脚交一区二区| 久久精品伊人| 免费久久99精品国产自在现线| 国产精品久久久久久久久久齐齐| 久久婷婷av| 97精品国产99久久久久久免费| 日韩国产一区二区| 日本中文字幕视频一区| 亚洲精品一级二级| 国产欧美日韩免费观看| 欧美大黑bbbbbbbbb在线| 国产伦精品一区二区三区千人斩 | 麻豆视频观看网址久久| 久久精品高清| 国产精品v亚洲精品v日韩精品| 91精品成人| 久久久久亚洲精品中文字幕| 久久av在线| 麻豆精品蜜桃| 欧美国产另类| 一区二区91| 激情综合自拍| 成午夜精品一区二区三区软件| 亚洲精品人人| 99亚洲视频| av高清不卡| 国产伦精品一区二区三区在线播放| 99视频精品全国免费| 久久av中文| 亚洲香蕉久久| 在线国产一区二区| 久久毛片亚洲| 国产精品s色| 香蕉久久久久久| 尤物精品在线| 婷婷综合六月| 精品五月天堂| 日韩高清成人在线| 狠狠色狠狠色综合日日tαg| 国产精品99视频| 欧美日韩18| 蜜臀久久久99精品久久久久久| av免费不卡国产观看| 国产精品资源| 日本一区福利在线| 水野朝阳av一区二区三区| 久久婷婷av| 美女福利一区二区三区| 欧美91在线| 国产乱码精品| 欧美日韩一区二区国产| 亚洲精品在线二区| 在线精品国产亚洲| 亚洲香蕉视频| 综合欧美亚洲| 综合国产精品| 亚洲在线久久| 免费人成精品欧美精品 | 国产美女精品视频免费播放软件| 免费观看在线色综合| 亚洲欧美不卡| 日韩一级不卡| 亚洲免费高清| 好吊一区二区三区| 欧美成人高清| 香蕉国产精品| 红桃视频欧美| 9色精品在线| 夜夜嗨网站十八久久| 国产一区91| 奶水喷射视频一区| 久久www成人_看片免费不卡| 亚洲欧美日本国产专区一区| 在线综合视频| 免费在线观看成人| 亚洲三级毛片| 91欧美极品| 国产极品一区| 国产成人精品福利| 中文字幕在线视频久| 在线人成日本视频| 久久国产免费| 亚洲一区二区网站| 在线精品福利| 日本欧美一区二区| 欧美综合精品| 久久香蕉网站| 亚洲涩涩在线| 国产综合欧美| 丝袜脚交一区二区| 日韩av中文字幕一区二区| 青草国产精品久久久久久| 国产精品美女午夜爽爽| 红杏一区二区三区| 日韩欧美字幕| 亚洲欧洲午夜| 日韩黄色av| 精品国产一区二区三区噜噜噜| xxxxx性欧美特大| 欧美日韩国产一区精品一区| 亚洲免费网址| 国产欧美一区二区三区精品观看| 久久99国产精品视频| 欧美一区久久久| 国产视频欧美| 日韩av一区二区在线影视| 麻豆国产欧美一区二区三区| av日韩中文| 国产亚洲永久域名| 欧美在线精品一区| 国产白浆在线免费观看| 99国产精品| 国产欧美91| 成人日韩在线观看| 亚洲丝袜美腿一区| 麻豆免费精品视频| 欧美亚洲国产激情| 日韩精品国产欧美| 日韩电影二区| 亚洲欧洲免费| 岛国av免费在线观看| 亚洲欧美日韩国产综合精品二区| 国产情侣久久| 欧美成人高清| 国产日韩中文在线中文字幕| 在线天堂中文资源最新版| 另类国产ts人妖高潮视频| 国产精品一区二区三区av麻| 亚洲成av在线| 日韩av成人高清| 日韩中文在线电影| 最新国产精品视频| 六月婷婷综合| 亚洲精品第一| 国产精选在线| 日韩综合一区二区| 亚洲成人av观看| 青青国产精品| 亚洲性图久久| 麻豆一区二区99久久久久| 最新国产拍偷乱拍精品| 国产精品mv在线观看| 午夜精品亚洲| 精品资源在线| 亚洲伊人精品酒店| 日韩黄色大片| 欧美在线黄色| 在线亚洲精品| 国产不卡人人| 日韩一区二区三免费高清在线观看 | 国产精品成人自拍| 好吊日精品视频| 欧美国产另类| 午夜亚洲精品| 精品久久91| 色综合视频一区二区三区日韩 | 婷婷精品在线| 久久婷婷丁香| 欧美激情在线精品一区二区三区| 国产精品美女久久久浪潮软件| 国产 日韩 欧美 综合 一区| 日韩欧美三区| 午夜在线播放视频欧美| 成人日韩在线观看| 麻豆精品蜜桃视频网站| 天堂久久av| 亚洲一区二区三区免费在线观看| 在线看片国产福利你懂的| 国产欧美一区二区三区国产幕精品| 亚洲精品1区2区| 免费污视频在线一区| 国产乱码精品| 一本综合精品| 一区在线免费| 99国产精品一区二区| 精品久久免费| 国产精品久久乐| 日韩动漫一区| 亚洲一区中文| 一区免费在线| 国产一区日韩一区| 久久久人人人| 日韩欧美少妇|