首页 > 其他分享 >简单记录下Spring boot 3.1的升级过程

简单记录下Spring boot 3.1的升级过程

时间:2023-06-09 16:45:04浏览次数:46  
标签:spring boot redis session Spring 3.1 Cloud

Spring Boot在2023年的5月18号发布了3.1版本,手里有些项目版本是2.X,借这个机会把项目升级到最新版本+更新JDK 20

在这里简单随便记录一下踩坑的地方,在文章的末尾放上了官方的migration向导,你可以根据此参考升级你的项目。

 

通过Spring Initializr获取最新的版本,拷贝至项目里。 

引入migrator依赖

项目引入migrator依赖会析应用程序的环境和打印诊断,会在启动时打印出某个属性过期了需要更新修改替换等。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-properties-migrator</artifactId>
    <scope>runtime</scope>
</dependency>
或者,使用Gradle:

runtime("org.springframework.boot:spring-boot-properties-migrator")

 

 

替换avax包名

2009 年,Oracle宣布收购 SUN,Java 相关技术自然归 Oracle 所有,在 2017 年,Oracle 宣布开源 Java EE 并将项目移交给 Eclipse 基金会。
但不能再使用 Java EE这个 名称,Eclipse 基金会接受了这个要求并且改名为 Jakarta EE

javax的包名都需要替换成jakarta,可以用IDE的批量查找替换功能直接把javax替换成jakarta,但为了替换更精确,我还是把名字写长了一点。

import  javax.validation  => import  jakarta.validation

import javax.servlet. =>  import jakarta.servlet.

import javax.mail.  => import jakarta.mail.

import javax.inject. = > import jakarta.inject

 

迁移spring security至6.1

本次spring boot 3.1中将spring security版本升级到了6.1其中很多东西发生了变化,比如常见的配置WebSecurityConfigurerAdapter直接被删除。

如果你有类似与这种配置,都需要替换成Bean注入的形式:

public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  @Override   protected void configure(HttpSecurity httpSecurity) throws Exception {   httpSecurity   .csrf().disable()   //其他配置... }

将其替换为:

@Bean
public SecurityFilterChain filterChain(HttpSecurity httpSecurity) {
return 
 httpSecurity.csrf(c->c.disable());
   //其他配置
    http.build();
}

还有一个细节是,这些配置现在都变成函数式了

通过查看方法参数声明得知,

HttpSecurity csrf(Customizer<CsrfConfigurer<HttpSecurity>> csrfCustomizer)....
@FunctionalInterface
public interface Customizer<T> {
   void customize(T t);

   static <T> Customizer<T> withDefaults() {
      return (t) -> {
      };
   }
}

我们需要把配置进行一下修改:

将httpSecurity.csrf()  ;
变为: httpSecurity.csrf(c->c.disable()) ;
或者用Method Reference语法简写为: http.csrf(AbstractHttpConfigurer::disable);

其他列如http.authorizeHttpRequests也是如此


spring seuciry的关于自动保存SecurityContextHolder 也有改动,如果你的项目自定义了一些过滤器Filter可能会发现登录失效的问题。

Migrating to 6.0可以参考官方的迁移教程进行处理,因为对于spring seuciry的定制情况都不一样,这里就不展开了。

会话管理迁移 :: Spring 安全性

 

修复启动错误

spring boot从很早的一个版本开始就禁止了循环依赖,启动会报错。

你可以加入:spring.main.allow-circular-references=true来解决这个错误,更好的办法是解决项目中循环依赖情况。

Description:

The dependencies of some of the beans in the application context form a cycle:
Action:
Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. 
As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.

顺便提一下,基于字段变量的依赖注入很早就不推荐的包括使用@Autowired、@Resource、@Inject等

 

使用基于字段的依赖注入,随着时间的推移我们会在类中逐渐添加越来越多的其他依赖项,@Autowired我们用着很舒服,但很容易忽略类中的依赖其他类已经太多了。但是如果使用基于构造函数的依赖注入,构造函数参数会变得越来越大,我们一眼就可以察觉到哪里不对劲。让我更容易设计出符合单一职责设计的类。使用基于字段的依赖注入还会有与依赖注入容器紧密耦合,和隐藏的依赖关系的问题存在。

 

Swagger 错误

Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerException:

 

如果项目中同时存在Spring Boot 3.X 和Swagger 3.0.0 可能会出错,

报错原因
Springboot2.6以后将SpringMVC 默认路径匹配策略从AntPathMatcher 更改为PathPatternParser
Springfox 使用的路径匹配是基于AntPathMatcher的,而Spring Boot 2.6.X以上使用的是PathPatternMatcher

解决方案是加入配置:spring.mvc.pathmatch.matching-strategy=ant_path_matcher或者只用swagger 2.X版本或者换为spring doc生成文档。

 

输出的日期错误

在spring boot 3.1升级后,我发现日期格式和时间均不正确,后面经过查找资料发现spring提供一个参数。用这个参数可以修复这个问题:

logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS,Asia/Shanghai

 

Redis配置错误

spring.redis.host=

spring.redis.lettuce.host=

spring.data.redis.lettuce.pool.max-active=

这些属性现在变为了:

spring.data.redis.host=

spring.data.redis.lettuce.pool.max-active=

 

分布式Session存储

这个项目用到了spring session redis来存储会话,

还需要修改一下配置:

spring.session.store-type=redis
替换为:server.servlet.session.persistent=true

你项目如果用到了FindByIndexNameSessionRepository会导致注入不成功,启动失败。需要配置改成:spring.session.redis.repository-type=indexed

或者使用对应的注解。但目前为止,我还没有发现官方有关此处改动的文档说明。

如果你的项目深入用到了spring session redis + spring security,比如请参考官方的示例进行升级:

spring-session/spring-session-samples at main · spring-projects/spring-session (github.com)

 

 

Spring Cloud版本

spring boot 3.1对应的Cloud版本是2022.0.2

 

升级后部分Cloud组件也有的属性变化,这里拿常见的feign举例。例如:

feign.circuitbreaker.enabled=true

变为:spring.cloud.openfeign.circuitbreaker.enabled=true

feign.okhttp.enabled=true

变为:spring.cloud.openfeign.okhttp.enabled=true

 

根据你使用的组件去官方文档按Ctrl+F搜索一下关键词,基本上就能找到新的对应属性。

 

如果你的Cloud版本很早是Netflix版本,有ribbon和hystrix等组件,这两个现在被spring cloud loadbanlencer和resilience4j替换了。

随便说下Spring Cloud Netflix进入维护模式是不包括Eureka的,那些说Spring Cloud被全盘抛弃,建议你Spring Cloud Alibaba的大概是培训班、卖课的说辞。

这里不是说Spring Cloud Alibaba不好用,我只是讨厌某些卖课机构、无良自媒体的胡编乱造。请以Spring官方信息为准。

Spring Cloud Netflix部分组件进入维护模式,官方也给出了替代方案:

Spring Cloud Greenwich.RC1 available now

 

 

参考资料:

Spring Boot 3.0 Migration Guide · spring-projects/spring-boot Wiki (github.com)

Migrating to 6.0 :: Spring Security

Spring Boot 3.1 Release Notes · spring-projects/spring-boot Wiki (github.com)

 




 

标签:spring,boot,redis,session,Spring,3.1,Cloud
From: https://www.cnblogs.com/sunyl/p/17469323.html

相关文章

  • java(springboot)实现将一个pdf按页码转成多张图片
    以下是一个将PDF转换成JPG格式图片的SpringBoot接口代码:importorg.apache.pdfbox.pdmodel.PDDocument;importorg.apache.pdfbox.rendering.PDFRenderer;importorg.springframework.http.MediaType;importorg.springframework.scheduling.annotation.Async;import......
  • Quartz + SpringBoot 实现定时任务(多任务,多执行时间)代码模板(直接CV即可)
    一,什么是Quartzquartz是一款开源且丰富特性的Java任务调度库,用于实现任务调度和定时任务。它支持各种任务类型和灵活的配置选项,具备作业持久化、集群和分布式调度、错误处理和重试机制等功能。Quartz被广泛应用于各种应用程序中,提供可靠和灵活的任务调度解决方案。二,核心概念......
  • [spring-boot] 源码解读#org.springframework.boot.ApplicationArguments [转发]
    1ApplicationArguments概述1.1简述org.springframework.boot.ApplicationArguments接口提供对用于运行org.springframework.boot.SpringApplication的参数访问。ApplicationArguments接口只有一个实现类DefaultApplicationArguments。1.2使用示例示例1@SpringBootA......
  • 用Spring MVC实现用户登录的完整实例
    用SpringMVC实现用户登录的完整实例本例子是再Eclipse中建立一个Tomcat工程,来讲解SpringMVC的全过程,实例代码如下:<一>编写日记文件放在myMVC/WEB-INF/src下#指定日志输入文件的大小log4j.appender.stdout.MaxFileSize=500KBlog4j.appender.stdout.MaxBackupI......
  • 使用Spring方法注入协调不同步的bean
    使用Spring方法注入协调不同步的bean<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEbeansPUBLIC"-//SPRING//DTDBEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd"><beans><bean......
  • SpringAOP
    一、proxy增强1、基于JDKjava自带的代理功能,只能针对接口,目标类与代理类为平级关系publicclassJDKProxy{ interfaceFoo{ voidfoo(); } staticclassTargetimplementsFoo{ publicvoidfoo(){ System.out.println("targetfoo"); } } publicstaticvo......
  • 深入浅出Spring原理及实战「缓存Cache开发系列」
    1.  缓存Cache的概念和作用在现代软件开发中,缓存已经成为了一个非常重要的概念。缓存是指将数据存储在一个临时的存储器中,以便于快速访问和读取。缓存的作用是提高系统的性能和响应速度,减少网络流量和数据库的负载。以电影院购票为例,当用户选择一部电影时,系统需要查询电影的......
  • 美团太细了:Springcloud 微服务优雅停机,如何实现?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • spring tx:advice 和 aop:config 配置事务
    <?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.or......
  • spring中获取属性的方法SpelExpressionParser()
    Aa=newA();Bb=newB();声明el表达式ExpressionParserpaeser=newSpelExpressionParser();设置你要通过el表达式取的字段Expressionaid=paeser.parseExpression("id");代表内置对象(b)中的id属性Expressionbid=paeser.parseExpression(b.id);如果b对象......