
spring boot 2.4之后无法解析bootstrap.yml问题解决
今天尝试使用spring boot 3.3和spring cloud 2023.0.3 版本搭建一个新项目,发现无法解析。
项目场景:
今天尝试使用spring boot 3.3和spring cloud 2023.0.3 版本搭建一个新项目,发现无法解析bootstrap.yml
问题描述
方案一
启动项目无法读取bootstrap.yml文件中配置中心,查看官方文档发现,Spring Boot 2.4 引入了一种通过属性导入配置数据的新方法spring.config.import。现在这是绑定到配置服务器的默认方式,,如果还想使用原先的bootstrap配置文件则可以使用下面的解决方式:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>4.0.4</version>
</dependency>
设置 spring.cloud.bootstrap.enabled=true
,可以正常启动
方案二 (推荐,官方默认的)
再application.properties
中添加配置项pring.config.import=optional:configserver:http://myhost:8888
,再项目中使用的nacos
配置中心,所以使用下面的配置:
spring:
cloud:
nacos:
config:
# server-addr 必须有该项,替换成自己的nacos地址,其他都可选
server-addr: http://172.23.192.1:8848
group: DEFAULT_GROUP
file-extension: yml
namespace: ${spring.profiles.active}
prefix: ${spring.application.name}
config:
import: "optional:nacos:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}?group=DEFAULT_GROUP"
import 中的格式如下:
optional:nacos:data-id?group=&refreshEnabled=&preference=remote
除了data-id
是必须的,其他都是可选的,当uri
中的配置优先获取,当没有则使用spring.cloud.nacos.config
中的配置或默认配置
优先获取uri
中的group参数, file-extension首先解析date-id的后缀名,如果没有则使用系统默认properties,
具体代码查看 com.alibaba.cloud.nacos.configdata.NacosConfigDataLocationResolver#loadConfigDataResources
:
private List<NacosConfigDataResource> loadConfigDataResources(
ConfigDataLocation location, Profiles profiles,
NacosConfigProperties properties) {
List<NacosConfigDataResource> result = new ArrayList<>();
URI uri = getUri(location, properties);
if (StringUtils.isBlank(dataIdFor(uri))) {
throw new IllegalArgumentException("dataId must be specified");
}
NacosConfigDataResource resource = new NacosConfigDataResource(properties,
location.isOptional(), profiles, log,
new NacosItemConfig().setGroup(groupFor(uri, properties))
.setDataId(dataIdFor(uri)).setSuffix(suffixFor(uri, properties))
.setRefreshEnabled(refreshEnabledFor(uri, properties))
.setPreference(preferenceFor(uri)));
result.add(resource);
return result;
}
# 其他方法略,只给出data-id的解析
private String dataIdFor(URI uri) {
String path = uri.getPath();
// notice '/'
if (path == null || path.length() <= 1) {
return StringUtils.EMPTY;
}
String[] parts = path.substring(1).split("/");
if (parts.length != 1) {
throw new IllegalArgumentException("illegal dataId");
}
return parts[0];
}
上述代码使用的版本是:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2023.0.1.2</version>
</dependency>
更多推荐
所有评论(0)