首页 > 其他分享 >springboot 自定义listener 添加环境变量。 抄的springboot项目去掉了一些不用的jar包后包 No Value Bound 错误排查。

springboot 自定义listener 添加环境变量。 抄的springboot项目去掉了一些不用的jar包后包 No Value Bound 错误排查。

时间:2023-06-15 14:35:18浏览次数:49  
标签:包后 springboot 自定义 项目 spring 配置文件 config name

1. 自定义listener 实现 ApplicationListener<ApplicationEnvironmentPreparedEvent>, Ordered (如果要设置优先级可以实现Ordered接口,注意order值越小优先级越高)

public class MyListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent>, Ordered {
    @Override
    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
        Map<String, Object> bootstrapMap = new HashMap<>();
        bootstrapMap.put("spring.config.name", "bootstrap");
        event.getEnvironment().getPropertySources().addLast(new MapPropertySource("bootstrap", bootstrapMap));
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE + 1;
    }
}

2. 启动类 addListener(new MyListener()) 即可。

 

问题: 抄的springboot项目去掉了一些不用的jar包后包 No Value Bound 错误排查。

看错误: No Value Bound , 具体没截图,发现是spring.dataousrce.xx 参数没有读取到。检查项目配置及apollo 没有问题。 

查看debug日志,发现读取了另外一个项目的配置,项目名yy,全局搜索关于yy的配置文件,在一个jar包中找到application.properties 。 

本项目有配置文件,名为 bootstrap.yml 。为什么原项目会读取bootstrap.yml作为项目配置,而新项目则是已application.properties 为项目配置。 

grpc:
  server:
    port: 8080

spring:
  application:
    name: xx   (application.properties 中该项为 yy)
  profiles:
    active: dev

debug代码发现 ConfigFileApplicationListener 读取配置文件: 

private Set<String> getSearchNames() {
			if (this.environment.containsProperty(CONFIG_NAME_PROPERTY)) {
				String property = this.environment.getProperty(CONFIG_NAME_PROPERTY);
				return asResolvedSet(property, null);
			}
			return asResolvedSet(ConfigFileApplicationListener.this.names, DEFAULT_NAMES);
		} 

其中 CONFIG_NAME_PROPERTY = spring.config.name  如果环境变量中有配置,则优先使用该名称读取配置文件,否则默认为 application。 

扩展1:配置文件路径的优先级问题

// Note the order is from least to most specific (last one wins)private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";

扩展2:不仅可以指定配置文件名,还能指定路径。

The 'spring.config.name' property can be used to specify an alternative name to load
* and the 'spring.config.location' property can be used to specify alternative search
* locations or specific files.

应该是老项目指定了spring.config.name , 发现老项目引入了springcloud, 定义了BootstrapApplicationListener 。 

 










标签:包后,springboot,自定义,项目,spring,配置文件,config,name
From: https://www.cnblogs.com/zhangchenglzhao/p/17482788.html

相关文章

  • 搜狗五笔 date 自定义时间格式
    搜狗五笔date自定义时间格式 搜狗五笔date默认打出的是“2023-6-15”,如果需要“2023-06-15”,则需要在自定义短语中设置 属性设置-高级-找到“自定义短语”旁边的"设置"按钮,点击“设置”。点击“添加新定义”:缩写输入:date下面输入框输入:#$year-$month_mm-$day_dd保存......
  • ajax请求springboot
    老是忘记ajax请求格式,记录一下吧后面看自己的functionsave(){varURL="/reconciliation/wzglWzMaterilApplicationDetail/saveSupplier";varcc=JSON.stringify({data:"world",p:{pag:0,pageS......
  • springboot项目启动失败之 org.springframework.boot.env.OriginTrackedYamlLoader.cr
    1、检查一下父项目的module的依赖是否,以及版本是否一致。例如<dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.30</version></dependency>2、如何知道自己的org.yaml的版本,可以双击Shift键,输入如图所示,注意划红线的地方就是......
  • springboot优点
    传统的Spring应用部署时,通常会将应用打成WAR包形式并部署到Tomcat、Jetty或Undertow服务器中。 SpringBoot框架内嵌了Tomcat、Jetty和Undertow服务器,于是可以将应用打包成jar,直接运行一个jar包就能启动一个web服务 是怎么内嵌的tomcat 这个依赖是SpringBootStar......
  • SpringBoot+druid+dynamic+clickhouse+mysql实现读写分离
    背景:clickhouse+mysql实现读写分离1.配置mysql2.安装clickhouse3.使用可视化工具连接clickhouse4.创建clickhouse的数据库并连接mysql5.SpringBoot+druid+dynamic配置多数据源实现读写分离一.背景由于系统数据量过大,查询条件自定义过多,mysql在查询时响应太慢,所以使用cli......
  • 界面控件DevExtreme UI组件——增强的自定义功能
    在本文中,我们将回顾DevExtremeUI组件在v22.2版本主要更新中一系列与自定义相关的增强。DevExtreme拥有高性能的HTML5/JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NETCore,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac,到ASP.NETCore......
  • springboot启动流程 (1) 流程概览
    本文将通过阅读源码方式分析SpringBoot应用的启动流程,不涉及Spring启动部分(有相应的文章介绍)。本文不会对各个流程做展开分析,后续会有文章介绍详细流程。SpringApplication类应用启动入口使用以下方式启动一个SpringBoot应用:@SpringBootApplicationpublicclassSpringBoo......
  • Vue自定义校验
    age:[{required:true,message:'请输入年龄',trigger:'blur'},{validator:(rule,value,callback)=>{if(value>=18){callback();}else{callback(newError("教练年龄必须大于18周岁"));}}......
  • SpringBoot集成支付宝 - 少走弯路就看这篇
    最近在做一个网站,后端采用了SpringBoot,需要集成支付宝进行线上支付,在这个过程中研究了大量支付宝的集成资料,也走了一些弯路,现在总结出来,相信你读完也能轻松集成支付宝支付。在开始集成支付宝支付之前,我们需要准备一个支付宝商家账户,如果是个人开发者,可以通过注册公司或者让有公......
  • springboot+elementUI
    功能简介后端用springboot实现数据库的增删改查,前端用vue中的elementUI编写,实现简单的数据展示和增删改。环境准备1.vue环境vue安装:https://www.cnblogs.com/xiaozhaoboke/p/16888421.html安装好后打开vueui进入项目管理器,创建项目添加elementUI插件和axios插件2......