当前位置: 首页 > 后端技术 > Java

我深信!SpringBoot升级后,我已经一个星期没跑这个服务了!(下图)

时间:2023-04-01 22:05:27 Java

在上次升级过程中几乎已启动并运行90%。这周一上班解决了一个小问题后,服务已经开始正常运行了,于是用其他一些服务测试了一下,发现Gotsomeothererror,所以继续。14.DiscoveryEnabledServerNotFound主要问题是eureka中没有ribbon相关的依赖。由以下原因引起:java.lang.NoClassDefFoundError:com/netflix/niws/loadbalancer/DiscoveryEnabledServeratjava.lang.Class.getDeclaredMethods0(NativeMethod)~[?:?]atjava.lang.Class.privateGetDeclaredMethods(Class.java:3167)~[?:?]在java.郎。班级。getDeclaredMethods(Class.java:2310)~[?:?]在org.弹簧框架。-5.3.23.jar:5.3.23]atorg.springframework.util.ReflectionUtils.doWithLocalMethods(ReflectionUtils.java:321)~[spring-core-5.3.23.jar:5.3.23]解决方法:手动引入相关依赖包裹。com.netflix.ribbonribbon-loadbalancer2.7.18com.netflix.ribbonribbon-eureka2.7.18org.springframework.cloudspring-cloud-启动器-netflix-ribbon2.2.10.RELEASE15.middlewarecirculardependency还是循环依赖错误,之前没注意看代码,直接设置为delayInitialize,仔细看发现代码是这样写的,可以仔细看看。然后开始报错:Causedby:org.springframework.beans.factory.UnsatisfiedDependencyException:Errorcreatingbeanwithname'cachesEndpoint'definedinclasspathresource[org/springframework/boot/actuate/autoconfigure/cache/CachesEndpointAutoConfiguration.class]:Unsatisfied通过方法'cachesEndpoint'参数0表示的依赖性;嵌套异常是org.springframework.beans.factory.UnsatisfiedDependencyException:请求的bean当前正在创建中:是否存在无法解析的循环引用?初始化一下延迟一下,然后开始发现还是报错。org.springframework.beans.factory.BeanCreationException:创建名为“org.springframework.boot.actuate.autoconfigure.metrics.cache.CacheMetricsRegistrarConfiguration”的bean时出错:通过构造函数实例化Bean失败;嵌套异常是org.springframeworkanInstbeans。无法实例化[org.springframework.boot.actuate.autoconfigure.metrics.cache.CacheMetricsRegistrarConfiguration]:构造函数抛出异常;nestedexceptionisjava.lang.StackOverflowError解决办法:去掉Autowired注入,15、16问题全部解决。17.kafka-clients版本与spring-kafka不兼容。升级后,默认的spring-kafka是2.8.10版本。KafkaTemplate报错找不到类,因为本地的kafka-clients使用的是2.3.0版本。引起:java.lang.IllegalStateException:无法从ClassLoader[jdk.internal.loader.ClassLoaders$AppClassLoader@9e89d68]内省类[org.springframework.kafka.core.KafkaTemplate]引起:java.lang.NoClassDefFoundError:org/Apache/kafka/clients/consumer/ConsumerGroupMetadata解决方案:将kafka-clients升级到兼容版本3.0.2,也就是spring-cloud-dependency依赖的版本。18、Swagger启动报错这个错误是因为新版SpringBoot将SpringMVC默认的路径匹配策略从AntPathMatcher改为PathPatternParser。这个报错这里是WARN,非常隐蔽,需要仔细查找。[WARN][2022.11.0816:17:39.963][10.135.0.95][][main][org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext()]-上下文初始化期间遇到异常-取消pt刷新尝试:org.springframework.context.ApplicationContextException:无法启动bean'documentationPluginsBootstrapper';nestedexceptionisjava.lang.NullPointerException解决方法:配置为原来的AntPathMatcher,增加配置spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER这个错误信息是一行WARN日志,非常难找。另一个原因是它是根据在线信息搜索定位的。我真的被这个错误信息说服了。19.spring-session依赖报错启动报错信息:nattemptwasmadetocallamethodthatdoesnotexist.尝试是从以下位置进行的:org.springframework.boot.autoconfigure.session.SessionAutoConfiguration$ServletSessionConfiguration.cookieSerializer(SessionAutoConfiguration.java:109)Thefollowingmethoddidnotexist:'voidorg.springframework.session.web.http.DefaultCookieSerializer.setSameSite(java.lang.String)'调用方法的类,org.springframework.boot.autoconfigure.session.SessionAutoConfiguration$ServletSessionConfiguration,从以下位置加载:jar:file:/Users/user/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.7.5/spring-boot-autoconfigure-2.7.5.jar!/org/springframework/boot/autoconfigure/session/SessionAutoConfiguration$ServletSessionConfiguration.class被调用方法的类,org.springframework.session.web.http.DefaultCookieSerializer,可从以下位置获得ons:jar:file:/Users/user/.m2/repository/org/springframework/session/spring-session/1.3.5.RELEASE/spring-session-1.3.5.RELEASE.jar!/org/springframework/session/web/http/DefaultCookieSerializer.classspring-session用的是1.3.5.RELEASE,但是打开Maven仓库,这是最新版本?而且还是2019版?事实上,情况并非如此。搜索Github代码后,发现代码已经模块化。新版本应该引入spring-session-coreorg.springframework.sessionspring-session-core2.7.020.spring-security版本兼容问题看到SessionAutoConfiguration中的代码,发现spring-security相关的依赖代码发生了变化。解决方法:引入最新版本的spring-security-web。org.springframework.securityspring-security-web5.7.421.RibbonLoadBalancerClient启动错误信息:org.springframework.retry.RetryException:无法恢复;嵌套异常是java.lang.AbstractMethodError:Receiver类org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient没有定义或继承已解析方法方法的实现(/String;Lorg/springframework/cloud/client/loadbalancer/Request;)lorg/springframework/cloud/client/ServiceInstance;接口org.springframework.cloud.client.loadbalancer.ServiceInstanceChooser。原因是位于spring-cloud-commons的ServiceInstanceChooser#choose方法发生了变化。为了继续使用spring-cloud-netflix-ribbon包,只能引入最新版本2.2.10.RELEASE更新到2021年,这个包的最后更新时间是2021年11月,所以这里的实现还是Is旧的选择方法。解决方法:使用相同的包名自己重写类。choose方法的逻辑其实和原来的object方法是一样的,也可以拉下封装改代码重新封装。22、MongoDB在新版spring-boot-autoconfigure下报错。MongoClientFactory的构造函数变了,之前的写法有编译错误。之前的参数写法是MongoProperties。returnnewMongoClientFactory(mongoProperties).createMongoClient(mongoClientOptions());现在的写法:MongoClientSettingsBuilderCustomizercustomizer=newMongoPropertiesClientSettingsBuilderCustomizer(mongoProperties,environment);returnnewMongoClientFactory(Lists.newArrayList(customizer)).createMongoClient(mongoClientOptions());另外一个问题是原来的createMongoClient传参是MongoClientOptions,现在是MongoClientSettings。heartbeatFrequency、heartbeatConnectTimeout等原来的写法是不一样的。让我向您展示当前的编写方式:MongoClientSettings.builder().applyToServerSettings(builder->builder.heartbeatFrequency(8000,TimeUnit.MILLISECONDS)).applyToConnectionPoolSettings(builder->builder.maxConnectionIdleTime(30000,TimeUnit.MILLISECONDS))。applyToSocketSettings(builder->builder.connectTimeout(30000,TimeUnit.MILLISECONDS)).build();另外,如果用morphia的话,变化会更大,基本老代码不会用这个方法,试过了,改不了,所以暂时放弃了。综上所述,事情到此基本告一段落。一些旧的代码改动太大,基本要舍弃重写。让我们暂时搁置它。