spring boot 2.0.6 升級(采坑)感想
1残腌、為什么要升級
因為我就是喜歡用最新的版本蟆盹。
開個玩笑逾滥,
當你每天面對的核心代碼依賴版本是幾年前的時候;
當你想用的某個新的特性因為版本問題無法使用的時候舔哪;
當jdk都已經(jīng)升級到了11而你的spring版本只支持到8捉蚤;
當你每天看到的博客里面都說spring5各種特性的時候缆巧;
所謂兵欲善其事,必先利其器墩莫,你是否在這一刻心動了狂秦,是時候改變了裂问,時代在進步堪簿,而我不想太落后哪审。
也許有人說現(xiàn)在的版本很穩(wěn)定湿滓,你升級了版本后除了問題怎么辦叽奥?(一片烏鴉飛過天際....我不想回答這個問題)
那么接下來進入正題,升級的血淚史來了赵哲。。筷屡。毙死。。再菊。。為自己默哀28秒
2稠诲、升級概要
步驟:
1. 從官網(wǎng)找到最新版本:2.0.6.RELEASE
2. 找到官方Demo(https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples)ps:原來支持這么多東西略水,不怕不怕
3. 簡單粗暴渊涝,不要慫,直接把項目里面的各種依賴升級到最新版本。ps:當然嘱蛋,請不要影響進展的業(yè)務(wù),拉個新的分支出來
4. 運行項目凶伙,啪啪啪報錯函荣。。扳肛。
本次升級涉及到的版本變更如下:
1. spring boot 1.4.3.RELEASE 咚咚 2.0.6.RELEASE
2. druid-spring-boot-starter 1.1.6 咚咚 1.1.10
3. fastjson 1.2.44 咚咚 1.2.51
4. lombok 1.16.10 咚咚 1.18.2
3傻挂、坑坑坑
雷區(qū)1
數(shù)據(jù)庫連不上了⊥谙ⅲ快到斬亂麻金拒,直接改配置套腹。
spring:
datasource:
url: jdbc:mysql://localhost:3306?useSSL=false&allowMultiQueries=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
username: username
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
雷區(qū)2
老版本
spring:
profiles:
#active: ${SERVER_ENVIROMENT}
active: ${SERVER_ENVIROMENT:dev}
mvc:
throw-exception-if-no-handler-found: true
resources:
add-mappings: false
http:
multipart:
max-file-size: 10MB
max-request-size: 15MB
新版本
spring:
profiles:
#active: ${SERVER_ENVIROMENT}
active: ${SERVER_ENVIROMENT:dev}
mvc:
throw-exception-if-no-handler-found: true
resources:
add-mappings: false
servlet:
multipart:
max-file-size: 10MB
max-request-size: 15MB
雷區(qū)3
當服務(wù)不需要加載數(shù)據(jù)源的時候绪抛。
老版本
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
新版本:
@SpringBootApplication(exclude = {DruidDataSourceAutoConfigure.class,DataSourceAutoConfiguration.class})
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
原因:我再研究研究,時間緊迫电禀,大家也可以自行去搜索搜索幢码。和新版本默認使用HikariCP作為數(shù)據(jù)庫連接池有關(guān)。
雷區(qū)4
直接上代碼吧
老版本:
@Configuration
public class MyWebConfig extends WebMvcConfigurerAdapter {}
新版本:
@Configuration
public class MyWebConfig implements WebMvcConfigurer {}
就是這么不一樣
雷區(qū)5
由于雷區(qū)4當時沒有發(fā)現(xiàn)導(dǎo)致我的代碼自動化腳本一片飄紅鞭呕,原因是HttpMessageConverter
Spring默認會使用MappingJackson2HttpMessageConverter
蛤育,因為雷區(qū)4里面的老版本配置不生效宛官,項目里面以前都統(tǒng)一用的FastJsonHttpMessageConverter
作為Json轉(zhuǎn)換器
雷區(qū)6(零零散散花費了我大概一天時間)
原因
* 由于項目中的自研SOA框架底層RPC的時候用的是RestTemplate。
* 我并沒有自定義RestTemplate的HttpMessageConverter
* 所以RestTemplate的http請求響應(yīng)解析用的是MappingJackson2HttpMessageConverter
結(jié)果
* 導(dǎo)致響應(yīng)實體沒有添加無參構(gòu)造的時候報錯
解決過程:
- 自定義
RestTemplate
的HttpMessageConverter
瓦糕,去掉MappingJackson2HttpMessageConverter
底洗,加上FastJsonHttpMessageConverter
。 - 心想咕娄,這下沒問題了吧亥揖,好,啟動項目圣勒,what a fuck,啟動不起來了费变。
- 就這個問題找了好幾個小時,各種換
HttpMessageConverter
順序圣贸,各種debug挚歧,就是解決不了啊,還有別的事情吁峻,哎滑负,今天果斷放棄。 -
第二天空一點點了用含,接著調(diào)矮慕。。啄骇。過程就不贅述了痴鳄,也怪眼神不好,沒看到以下坑B的報錯:
解決方案
至此缸夹,問題也定位到了痪寻,fastjson版本升級問題:Content-type變成了Content-type:*/*
。驚不驚喜明未,刺不刺激槽华,上改動后的代碼吧。
@Bean
public RestTemplate getRestTemplate() {
RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
converters.removeIf(c -> c instanceof MappingJackson2HttpMessageConverter);
converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8));
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
List<MediaType> supportedMediaTypes = new ArrayList<>();
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
supportedMediaTypes.add(MediaType.APPLICATION_PDF);
supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XML);
supportedMediaTypes.add(MediaType.IMAGE_GIF);
supportedMediaTypes.add(MediaType.IMAGE_JPEG);
supportedMediaTypes.add(MediaType.IMAGE_PNG);
supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
supportedMediaTypes.add(MediaType.TEXT_HTML);
supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
supportedMediaTypes.add(MediaType.TEXT_PLAIN);
supportedMediaTypes.add(MediaType.TEXT_XML);
fastJsonHttpMessageConverter.setSupportedMediaTypes(supportedMediaTypes);
converters.add(fastJsonHttpMessageConverter);
restTemplate.setMessageConverters(converters);
return restTemplate;
}
好了趟妥,現(xiàn)在請求和響應(yīng)實體不寫默認構(gòu)造參數(shù)也可以啦猫态。
結(jié)束語
分別總是在九月,回憶是思念的愁披摄。
感想也該結(jié)束了亲雪。
我們會持續(xù)學(xué)習(xí),爭取早日用上Spring5的新特性疚膊。