项目脚手架 项目脚手架是基于springBoot2。7。6jdk17的springCloud分布式微服务架构。主要组件和框架有:nacos,sentinel,springCloudGateway,kafka,elasticsearch,mysql,redis,caffeine,mapstruct,swagger2,skywalking,mybatisplus。前段时间本来是jdk1。8的,后面升到了jdk17,jdk升级就记得启动脚本里要加:addopensjava。basejava。langALLUNNAMEDaddopensjava。basejava。lang。reflectALLUNNAMED。下面进入正题,升级springboot3。0。2过程。升级难点 1:版本依赖 2:springCloudGateway升级异常 3:KafkaTemplate 4:swagger改成了springdoc 5:redis配置文件改动版本依赖 springboot3升级了大部分的依赖,我拿几个重点的,当然有的可能是没必要升级,我没一个一个试,基本都是找的最新版本。代码里面主要修改就是javax改成了jakarta,这个使用idea或者其他工具全局替换就行。springbootdependencies:3。0。2springclouddependencies:2022。0。1springcloudalibabadependencies:2022。0。0。0RC1springcloudstarter:4。0。1springcloudstartergateway:4。0。1springbootadminstarterserver:3。0。0jakarta。xml。bindapi:4。0。0ojdbc8:21。9。0。0mysqlconnectorjava:8。0。32hibernatevalidator:8。0。0。Finalmybatisplusbootstarter:3。5。3。1mybatisspringbootstarter:3。0。1dynamicdatasourcespringbootstarter:3。6。1 有个重要的依赖,swagger2已经不适用springboot3了,我换成了springdocdependencygroupIdcom。github。xiaoymingroupIdknife4jopenapi3jakartaspringbootstarterartifactIdversion4。0。0versiondependency javax改成jakarta,当然不止这一个,其他的就全部替换就OK。 javaxspringCloudGateway 网关在升级的时候,我碰到了两个问题,一个是说网关的依赖里面有springbootstarterweb的依赖,导致报错,这个我没去找具体哪个依赖了,直接在配置文件里面加了个配置搞定:spring。main。webapplicationtypereactive。还有一个是说有两个CacheManager的bean。我只找到一个,直接重写覆盖LocalResponseCacheAutoConfiguration类,在gatewayCacheManager方法上加了一个注解Primary搞定。PrimaryBean(name{gatewayCacheManager})publicstaticCacheManagergatewayCacheManager(LocalResponseCachePropertiescacheProperties){CaffeineCacheManagercaffeineCacheManagernewCaffeineCacheManager();caffeineCacheManager。setCaffeine(caffeine(cacheProperties));returncaffeineCacheManager;} 还有一个小问题,网关的sentinel报错信息有修改,原先我项目里有个方法handleBlockedRequest,我直接去掉了。现在改成了继承SentinelGatewayBlockExceptionHandler类,重写handle方法直接返回一个json数据。KafkaTemplate 项目中用的消息中间件是kafka,以前发送消息是:发送消息ListenableFutureSendResultString,ObjectfuturekafkaTemplate。send(TOPICTEST,TOPICGROUP1,obj2String);future。thenAccept(newListenableFutureCallbackSendResultString,Object(){OverridepublicvoidonFailure(Throwablethrowable){发送失败的处理log。info(TOPICTEST生产者发送消息失败:throwable。getMessage());}OverridepublicvoidonSuccess(SendResultString,ObjectstringObjectSendResult){成功的处理log。info(TOPICTEST生产者发送消息成功:stringObjectSendResult。toString());}}); 现在是发送消息CompletableFutureSendResultString,ObjectfuturekafkaTemplate。send(TOPICTEST,TOPICGROUP1,obj2String);成功future。thenAccept(result{log。info(TOPICTEST生产者发送消息成功:result);});失败future。exceptionally(e{log。info(TOPICTEST生产者发送消息失败:e。getMessage());returnnull;});swagger swagger改动超级大,只怪当时项目用了swagger2注解,果断改成了springdoc 依赖换成:knife4jopenapi3jakartaspringbootstarter 注解改动 1:controller类注解:io。swagger。annotations。Api改成了io。swagger。v3。oas。annotations。tags。Tag; controller类 2:controller方法注解:io。swagger。annotations。ApiOperation;改成了io。swagger。v3。oas。annotations。Operation; controller方法 3:请求参数注解:io。swagger。annotations。ApiModel和io。swagger。annotations。ApiModelProperty都换成了io。swagger。v3。oas。annotations。media。Schema; 请求参数 注意这里以前的ApiModelProperty里面有个参数required换成了requiredMode,position参数没了,都要改。 还有swagger配置也要改,这是我直接从网上抄过来的配置,以前我还能分组的,现在不好使了,只有一个全部接口的分组了,打开贼慢。有时间我再试试。ConfigurationpublicclassSwaggerConfig{AutowiredprivateSwaggerModeldocketInfos;根据Tag上的排序,写入xorderreturntheglobalopenapicustomizerBeanpublicGlobalOpenApiCustomizerorderGlobalOpenApiCustomizer(){returnopenApi{if(openApi。getTags()!null){openApi。getTags()。forEach(tag{MapString,ObjectmapnewHashMap();map。put(xorder,RandomUtil。randomInt(0,200));tag。setExtensions(map);});}if(openApi。getPaths()!null){openApi。addExtension(xtest123,333);openApi。getPaths()。addExtension(xabb,RandomUtil。randomInt(1,200));}};}BeanpublicGroupedOpenApiuserApi(){String〔〕paths{};String〔〕packagedToMatch{docketInfos。getUrl()};returnGroupedOpenApi。builder()。group(全部接口)。pathsToMatch(paths)。addOperationCustomizer((operation,handlerMethod){returnoperation。addParametersItem(newHeaderParameter()。name(type)。example(gateway)。description(报文头来源)。schema(newStringSchema()。default(type)。name(gateway)。description(报文头来源)));})。packagesToScan(packagedToMatch)。build();}BeanpublicOpenAPIcustomOpenAPI(){InfoinfonewInfo();info。setTitle(docketInfos。getTitle());info。setDescription(docketInfos。getDescription());info。setTermsOfService(www。baidu。com);ContactcontactnewContact();contact。setName(123456);contact。setUrl(www。baidu。com);contact。setEmail(123456163。com);info。setContact(contact);info。setVersion(docketInfos。getVersion());info。setSummary(docketInfos。getDescription());returnnewOpenAPI()。info(info);}}redis redis主要是配置文件改了,以前是spring。redis。。。。改成了spring。data。redis。。。。 其他暂时没发现什么改动。总结 目前我项目中遇到暂时就遇到了这些,还有些组件没去试,像skywalking,es这些,还没试功能,项目能正常启动,交易能发通,就算升级成功了。还有一点,项目中用到了xxljob,这个没升级成功,升级之后freemarker模板有问题,让人头大,先不管了。