程序员开发实例大全宝库

网站首页 > 编程文章 正文

springboot2.7.6升级springboot3.0.2小结

zazugpt 2024-08-18 01:22:14 编程文章 22 ℃ 0 评论

项目脚手架

项目脚手架是基于springBoot2.7.6+jdk17的springCloud分布式微服务架构。主要组件和框架有:nacos,sentinel,springCloudGateway,kafka,elasticsearch,mysql,redis,caffeine,mapstruct,swagger2,skywalking,mybatis-plus。前段时间本来是jdk1.8的,后面升到了jdk17,jdk升级就记得启动脚本里要加:--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED。下面进入正题,升级springboot3.0.2过程。

升级难点

1:版本依赖

2:springCloudGateway升级异常

3:KafkaTemplate

4:swagger改成了springdoc

5:redis配置文件改动

版本依赖

springboot3升级了大部分的依赖,我拿几个重点的,当然有的可能是没必要升级,我没一个一个试,基本都是找的最新版本。代码里面主要修改就是javax改成了jakarta,这个使用idea或者其他工具全局替换就行。

spring-boot-dependencies:3.0.2
spring-cloud-dependencies:2022.0.1
spring-cloud-alibaba-dependencies:2022.0.0.0-RC1
spring-cloud-starter:4.0.1
spring-cloud-starter-gateway:4.0.1
spring-boot-admin-starter-server:3.0.0
jakarta.xml.bind-api:4.0.0
ojdbc8:21.9.0.0
mysql-connector-java:8.0.32
hibernate-validator:8.0.0.Final
mybatis-plus-boot-starter:3.5.3.1
mybatis-spring-boot-starter:3.0.1
dynamic-datasource-spring-boot-starter:3.6.1

有个重要的依赖,swagger2已经不适用springboot3了,我换成了springdoc

<dependency>
  <groupId>com.github.xiaoymin</groupId>
  <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
  <version>4.0.0</version>
</dependency>

javax改成jakarta,当然不止这一个,其他的就全部替换就OK。

springCloudGateway

网关在升级的时候,我碰到了两个问题,一个是说网关的依赖里面有spring-boot-starter-web的依赖,导致报错,这个我没去找具体哪个依赖了,直接在配置文件里面加了个配置搞定:spring.main.web-application-type=reactive。还有一个是说有两个CacheManager的bean。我只找到一个,直接重写覆盖LocalResponseCacheAutoConfiguration类,在gatewayCacheManager方法上加了一个注解@Primary搞定。

@Primary
@Bean(
        name = {"gatewayCacheManager"}
)
public static CacheManager gatewayCacheManager(LocalResponseCacheProperties cacheProperties) {
    CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
    caffeineCacheManager.setCaffeine(caffeine(cacheProperties));
    return caffeineCacheManager;
}

还有一个小问题,网关的sentinel报错信息有修改,原先我项目里有个方法handleBlockedRequest,我直接去掉了。现在改成了继承SentinelGatewayBlockExceptionHandler类,重写handle方法直接返回一个json数据。

KafkaTemplate

项目中用的消息中间件是kafka,以前发送消息是:

// 发送消息
ListenableFuture<SendResult<String, Object>> future = kafkaTemplate
    .send(TOPIC_TEST, TOPIC_GROUP1, obj2String);

future.thenAccept(new ListenableFutureCallback<SendResult<String, Object>>() {
  @Override
  public void onFailure(Throwable throwable) {
    //发送失败的处理
    log.info(TOPIC_TEST + " - 生产者 发送消息失败:" + throwable.getMessage());
  }

  @Override
  public void onSuccess(SendResult<String, Object> stringObjectSendResult) {
    //成功的处理
    log.info(TOPIC_TEST + " - 生产者 发送消息成功:" + stringObjectSendResult.toString());
  }
});

现在是

// 发送消息
CompletableFuture<SendResult<String, Object>> future = kafkaTemplate.send(TOPIC_TEST, TOPIC_GROUP1, obj2String);
// 成功
future.thenAccept(result -> {
    log.info(TOPIC_TEST + " - 生产者 发送消息成功:" + result);
});
// 失败
future.exceptionally(e -> {
    log.info(TOPIC_TEST + " - 生产者 发送消息失败:" + e.getMessage());
    return null;
});

swagger

swagger改动超级大,只怪当时项目用了swagger2注解,果断改成了springdoc

依赖换成:knife4j-openapi3-jakarta-spring-boot-starter

注解改动

1:controller类注解:io.swagger.annotations.Api改成了io.swagger.v3.oas.annotations.tags.Tag;

2:controller方法注解:io.swagger.annotations.ApiOperation;改成了io.swagger.v3.oas.annotations.Operation;

3:请求参数注解:io.swagger.annotations.ApiModel和io.swagger.annotations.ApiModelProperty都换成了io.swagger.v3.oas.annotations.media.Schema;

注意这里以前的@ApiModelProperty 里面有个参数required换成了requiredMode,position参数没了,都要改。

还有swagger配置也要改,这是我直接从网上抄过来的配置,以前我还能分组的,现在不好使了,只有一个全部接口的分组了,打开贼慢。有时间我再试试。

@Configuration
public class SwaggerConfig {


    @Autowired
    private SwaggerModel docketInfos;


    /**
     * 根据@Tag 上的排序,写入x-order
     *
     * @return the global open api customizer
     */
    @Bean
    public GlobalOpenApiCustomizer orderGlobalOpenApiCustomizer() {
        return openApi -> {
            if (openApi.getTags()!=null){
                openApi.getTags().forEach(tag -> {
                    Map<String,Object> map=new HashMap<>();
                    map.put("x-order", RandomUtil.randomInt(0,200));
                    tag.setExtensions(map);
                });
            }
            if(openApi.getPaths()!=null){
                openApi.addExtension("x-test123","333");
                openApi.getPaths().addExtension("x-abb",RandomUtil.randomInt(1,200));
            }

        };
    }

    @Bean
    public GroupedOpenApi userApi(){
        String[] paths = { "/**" };
        String[] packagedToMatch = { docketInfos.getUrl() };
        return GroupedOpenApi.builder().group("全部接口")
                .pathsToMatch(paths)
                .addOperationCustomizer((operation, handlerMethod) -> {
                    return operation.addParametersItem(new HeaderParameter().name("type").example("gateway").description("报文头来源").schema(new StringSchema()._default("type").name("gateway").description("报文头来源")));
                })
                .packagesToScan(packagedToMatch).build();
    }

    @Bean
    public OpenAPI customOpenAPI() {
        Info info = new Info();
        info.setTitle(docketInfos.getTitle());
        info.setDescription(docketInfos.getDescription());
        info.setTermsOfService("www.baidu.com");
        Contact contact = new Contact();
        contact.setName("123456");
        contact.setUrl("www.baidu.com");
        contact.setEmail("123456@163.com");

        info.setContact(contact);
        info.setVersion(docketInfos.getVersion());
        info.setSummary(docketInfos.getDescription());

        return new OpenAPI().info(info);
    }
}

redis

redis主要是配置文件改了,以前是spring.redis....改成了spring.data.redis....

其他暂时没发现什么改动。

总结

目前我项目中遇到暂时就遇到了这些,还有些组件没去试,像skywalking,es这些,还没试功能,项目能正常启动,交易能发通,就算升级成功了。还有一点,项目中用到了xxl-job,这个没升级成功,升级之后freemarker模板有问题,让人头大,先不管了。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表