SpringBoot 2.1.0 升級到 2.5.4 遇到的問題彙總

邢闖洋發表於2022-09-27

背景

本來是用的 SpringBoot 2.1.0,和 Nacos 版本忘記了。

後來升級 SpringBoot 2.5.4,然後 Spring Cloud 那一些也需要升級,隨後升級到了 Nacos 版本 2021.1。

升級完之後,將 bootstrap.yml 的 spring.cloud 那些註釋掉,啟動還是會報錯,Nacos 連線失敗。

未升級前只要將 spring.cloud nacos 那些註釋掉,頂多啟動的時候控制檯報些錯,但不會導致啟動不了。

解決

在 bootstrap.yml 中,不需要將那些註釋掉了,只需要加兩個 enabled 的引數設定為 false 就可以了。

spring:
  application:
    name: keepAccount
  cloud:
    nacos:
      discovery:
        enabled: false
        server-addr: 127.0.0.1:8848
      config:
        enabled: false
        server-addr: 127.0.0.1:8848
        file-extension: yml

這樣子,在啟動就不會報錯了。

之前的 CrossConfig 需要改一下,將 allowedOrigins("*") 改為 allowedOriginPatterns("*")

@Configuration
public class CrossConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
//                .allowedOrigins("*")
                .allowedOriginPatterns("*")
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                .allowCredentials(true)
                .maxAge(3600)
                .allowedHeaders("*");
    }
}

背景

和問題 1 有關聯,因為 SpringBoot 升級,SpringCloud 也需要升級,當升級後重啟 SpringBoot,發現 bootstrap.yml 中配置的應用埠號沒生效,變成了預設的 8080.

問題原因

從Spring Boot 2.4版本開始,配置檔案載入方式進行了重構。
另外也有配置的預設值變化,原來預設啟用 true 現在變更為 false 如下:
version:2.4之前

package org.springframework.cloud.bootstrap;
public class BootstrapApplicationListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent>, Ordered {
    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
        ConfigurableEnvironment environment = event.getEnvironment();
        if ((Boolean)environment.getProperty("spring.cloud.bootstrap.enabled", Boolean.class, true)) {
        }
    }
}

version:2.4.2

package org.springframework.cloud.util;
public abstract class PropertyUtils {
    public static boolean bootstrapEnabled(Environment environment) {
        return (Boolean)environment.getProperty("spring.cloud.bootstrap.enabled", Boolean.class, false) || MARKER_CLASS_EXISTS;
    }
}

解決辦法

pom檔案中引入如下配置

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

指定執行引數 spring.cloud.bootstrap.enabled 值為 true

spring:
  cloud:
    bootstrap:
      enabled: true

springboot專案打包時提示“程式包xxx不存在,找不到符號

SpringCloud版本升級後bootstrap.yml配置不生效

報錯:When allowCredentials is true, allowedOrigins cannot contain the special value

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章