SpringBoot - application.yml配置文件中yes/no,on/off在代码中读取的值为true/false

本文探讨了SpringBoot配置文件中yes/no/on/off被解析为布尔值的问题,提供了解决方案——在字符串前后添加单引号或双引号。通过实例演示了如何确保配置保持yes/no/on/off的形式并正确解析。

写在前面

在SpringBoot的项目中,当在配置文件中配置的值为yes/no或者on/off时,在SpringBoot内部解析时会将yes/no,on/off解析为true/false。

参数配置

参数配置如下:

spring:
  application:
    # 应用名称
    name: damp-drools2
  drools:
    use-redis: yes  # 解析为true
    path: classpath:com/tiantu/damp/**/*.drl
    mode: stream
    auto-update: no # 解析为false
    update: 60
    listener: on    # 解析为true
    verify: off     # 解析为false

问题分析

根据SpringBoot启动时加载配置文件的原理,查看源代码发现:

public class SafeConstructor extends BaseConstructor {

    public SafeConstructor(LoaderOptions loadingConfig) {
        super(loadingConfig);
        this.yamlConstructors.put(Tag.NULL, new SafeConstructor.ConstructYamlNull());
        this.yamlConstructors.put(Tag.BOOL, new SafeConstructor.ConstructYamlBool());
	}
	
	public class ConstructYamlBool extends AbstractConstruct {
        public ConstructYamlBool() {
        }

        public Object construct(Node node) {
            String val = SafeConstructor.this.constructScalar((ScalarNode)node);
            return SafeConstructor.BOOL_VALUES.get(val.toLowerCase());
        }
    }

    static {
        BOOL_VALUES.put("yes", Boolean.TRUE);
        BOOL_VALUES.put("no", Boolean.FALSE);
        BOOL_VALUES.put("true", Boolean.TRUE);
        BOOL_VALUES.put("false", Boolean.FALSE);
        BOOL_VALUES.put("on", Boolean.TRUE);
        BOOL_VALUES.put("off", Boolean.FALSE);
        RADIX_MAX = new int[17][2];
        int[] radixList = new int[]{2, 8, 10, 16};
        int[] var1 = radixList;
        int var2 = radixList.length;

        for(int var3 = 0; var3 < var2; ++var3) {
            int radix = var1[var3];
            RADIX_MAX[radix] = new int[]{maxLen(2147483647, radix), maxLen(9223372036854775807L, radix)};
        }

        TIMESTAMP_REGEXP = Pattern.compile("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:(?:[Tt]|[ \t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \t]*(?:Z|([-+][0-9][0-9]?)(?::([0-9][0-9])?)?))?)?$");
        YMD_REGEXP = Pattern.compile("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)$");
    }
}

解决方案

如果在配置中参数必须使用yes/no,on/off且期望在代码中读取的值也为yes/no,on/off,可以加上单引号或者双引号。

spring:
  application:
    # 应用名称
    name: damp-drools2
  drools:
    use-redis: 'yes'  # 解析为yes
    path: classpath:com/tiantu/damp/**/*.drl
    mode: stream
    auto-update: 'no' # 解析为no
    update: 60
    listener: "on"    # 解析为on
    verify: "off"     # 解析为off
<think>首先,用户的问题是关于SpringBoot应用中application.yml配置server.port无效的解决方案。我需要根据提供的引用内容来回答。回顾系统级指令:-所有行内数学表达式用$...$格式(但在这个上下文中可能不相关)。-独立公式用$$...$$并单独成段。-LaTeX语法正确。-使用中文回答。-生成相关问题。-在引用的段落末尾添加引用标识,例如[^1]。用户可见层指令:-回答结构清晰,帮助用户逐步解决问题。-保证回答真实可靠。-参考提供的站内引用。提供的引用:-[^1]:解决SpringBoot项目中配置application.yml中server.port不生效问题。解决办法:1.application.yml文件改为application.properties2.在resource新建一个config目录,将yml文件放到里面3.加入SpringCloud的注解,将application.yml变为bootstrap.yml(加载优先级高)-[^2]:解决SpringBootapplication.yml配置的server.port和server.servlet.context-path失效以及swagger访问不到的问题。这是因为SpringBoot在启动的时候优先加载properties文件,如果properties文件中没有再去读yml文件,而xxl-job-admin中正好自带了application.properties配置文件,覆盖了我们在application.yml中的配置导致自己的配置不生效。解决方案:-[^3]:SpringBoot--application.yml配置文件--用法。技术上,bootstrap.yml是被一个父级的SpringApplicationContext加载的。这个父级的SpringApplicationContext是先加载的,在加载application.ymlApplicationContext之前。-[^4]:Springbootapplication.properties或者application.yml环境的指定运行与配置。如果将application.properties注释掉,springboot仍然会读取其他appilcation-环境名.properties中的配置。并且properties的优先级高于yml1.2yml支持多文档块方式。从引用中提取关键点:-Properties文件优先级高于yml文件([^2]和[^4])。-如果有application.properties存在,它会覆盖application.yml([^2])。-解决方案包括:改为使用properties文件、移动ymlconfig目录、改为bootstrap.yml([^1])。-Bootstrap.yml有更高的加载优先级([^1]和[^3])。-Properties优先级高于yml([^4])。用户的问题:springbootapplication.yml配置server.port无效。我需要提供一个结构清晰的解决方案,步骤化。步骤:1.**检查文件优先级**:确认是否有application.properties文件存在,因为它可能覆盖yml配置([^2])。移除或重命名它。2.**使用bootstrap.yml**:改为使用bootstrap.yml,因为它在SpringCloud中优先级更高([^1]和[^3])。3.**移动配置文件**:将yml文件放到resource/config目录下,这可能提高优先级([^1])。4.**检查环境配置**:确保没有其他配置文件application-{profile}.properties覆盖设置([^4])。5.**其他可能原因**:比如依赖冲突或代码问题,但引用中未提到,我可以简要提及。确保回答真实可靠:基于引用内容,不添加未提及的解决方案。添加引用标识:在相关步骤末尾添加,如[^1]。生成相关问题:在回答后添加相关问题部分,如示例所示。使用中文回答。结构回答:-开头简述问题。-逐步提供解决方案。-结尾添加相关问题。</think>### Spring Bootapplication.yml配置server.port无效的解决方案 在Spring Boot应用中,配置`application.yml`文件时,`server.port`设置无效是常见问题,通常由配置文件加载优先级或冲突引起。以下是基于可靠实践的结构化解决方案,帮助您逐步排查和修复问题。解决方案参考了Spring Boot官方文档和社区最佳实践[^1][^2][^3][^4]。 #### 步骤1: 检查并处理配置文件优先级冲突 Spring Boot在启动时优先加载`application.properties`文件(如果存在),这会覆盖`application.yml`中的配置[^2][^4]。 - **操作步骤**: - 打开您的项目资源目录(通常是`src/main/resources`)。 - 检查是否存在`application.properties`文件。如果存在,请删除或重命名它(例如改为`application.properties.bak`)。 - 重新启动应用,测试`server.port`是否生效。 - **原因分析**: Properties文件优先级高于yml文件,优先级顺序为:`application.properties` > `application.yml`[^2][^4]。 #### 步骤2: 使用bootstrap.yml提升加载优先级 如果步骤1无效,可能是Spring Boot在加载上下文时未优先处理`application.yml`。改用`bootstrap.yml`(在Spring Cloud环境中优先级更高)[^1][^3]。 - **操作步骤**: - 在`src/main/resources`目录下,将`application.yml`重命名为`bootstrap.yml`。 - 在`bootstrap.yml`中明确添加`server.port`配置,例如: ```yaml server: port: 8080 # 替换为您的端口号 ``` - 确保项目中添加了Spring Cloud依赖(如果未使用Spring Cloud,此方法可能不适用)。在`pom.xml`中添加: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> <version>3.1.0</version> <!-- 使用最新版本 --> </dependency> ``` - 重新启动应用。bootstrap.yml会被父级ApplicationContext优先加载[^3]。 - **原因分析**: `bootstrap.yml`在Spring Cloud中先于`application.yml`加载,适合处理核心配置[^1][^3]。 #### 步骤3: 移动配置文件config目录 Spring Boot支持从特定目录加载配置,`config`目录的优先级高于默认位置[^1]。 - **操作步骤**: - 在`src/main/resources`下新建一个`config`目录。 - 将`application.yml`文件移动到此目录中(路径变为`src/main/resources/config/application.yml`)。 -yml文件中确认`server.port`设置正确,例如: ```yaml server: port: 8080 # 替换为您的端口号 ``` - 重新启动应用,检查端口是否生效。 - **原因分析**: Spring Boot加载配置文件的优先级为:`config/`目录 > 根目录[^1]。 #### 步骤4: 检查环境特定配置和依赖 如果以上步骤无效,可能是环境配置文件或依赖冲突导致: - **检查环境配置**: Spring Boot支持profile-specific文件(如`application-dev.yml`)。确保没有其他配置文件覆盖`server.port`。您可以在启动命令中指定active profile:`java -jar your-app.jar --spring.profiles.active=prod`[^4]。 - **验证依赖**: 检查pom.xml中是否有模块(如xxl-job-admin)自带properties文件,它可能覆盖您的配置[^2]。移除或排除冲突依赖。 - **日志排查**: 启动应用时添加`--debug`参数查看加载日志:`java -jar your-app.jar --debug`。搜索"Config file application"确认yml是否被读取。 #### 附加建议 - **测试工具**: 使用`curl localhost:8080`或浏览器访问端口验证。 - **回退方案**: 如果yml问题持续,考虑改用`application.properties`(语法简单,优先级高)[^1][^4]。例如: ```properties server.port=8080 ``` - **常见误区**: YAML缩进必须准确(使用空格,非制表符),且文件名拼写正确(`application.yml`非`applicaton.yml`)。 通过以上步骤,大多数`server.port`无效问题都能解决。如果问题依旧,建议检查Spring Boot版本(推荐2.x或3.x)或提供更多上下文(如完整yml文件)进一步诊断[^2][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cloneme01

谢谢您的支持与鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值