Springboot修改了application.yml或者.properties文件的引用后启动报错的问题

Spring Boot 配置错误:MalformedInputException解决与重新构建部署
本文探讨了在工作中修改Spring Boot项目中application.yml配置时遇到的`java.nio.charset.MalformedInputException`问题,解决步骤包括重启项目和Maven install,重点在于排查和修复过程,以及为何仅通过重新构建即可解决问题。

在工作的时候,很多情况下我们会使用定义生产、测试、开发等环境下所用的配置,然后在application.yml或者properties中引用相应的配置,偶然间我在修改配置中的showSql属性时,一启动项目就开始报错

Caused by: java.nio.charset.MalformedInputException: Input length = 1
	at java.nio.charset.CoderResult.throwException(CoderResult.java:281) ~[?:1.8.0_291]
	at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339) ~[?:1.8.0_291]
	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) ~[?:1.8.0_291]
	at java.io.InputStreamReader.read(InputStreamReader.java:184) ~[?:1.8.0_291]
	at org.yaml.snakeyaml.reader.UnicodeReader.read(UnicodeReader.java:125) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:183) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:176) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.reader.StreamReader.peek(StreamReader.java:136) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.scanner.ScannerImpl.scanPlain(ScannerImpl.java:1999) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.scanner.ScannerImpl.fetchPlain(ScannerImpl.java:1044) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:399) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:227) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingKey.produce(ParserImpl.java:558) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:158) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:148) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:214) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:144) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:236) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:227) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:215) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:144) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:236) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:227) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:215) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:144) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:236) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:227) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:215) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:144) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.composer.Composer.getNode(Composer.java:85) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.constructor.BaseConstructor.getData(BaseConstructor.java:123) ~[snakeyaml-1.23.jar:?]
	at org.yaml.snakeyaml.Yaml$1.next(Yaml.java:547) ~[snakeyaml-1.23.jar:?]
	at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:200) ~[spring-beans-5.1.19.RELEASE.jar:5.1.19.RELEASE]
	at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:164) ~[spring-beans-5.1.19.RELEASE.jar:5.1.19.RELEASE]
	at org.springframework.boot.env.OriginTrackedYamlLoader.load(OriginTrackedYamlLoader.java:76) ~[spring-boot-2.1.18.RELEASE.jar:2.1.18.RELEASE]
	at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:50) ~[spring-boot-2.1.18.RELEASE.jar:2.1.18.RELEASE]
	at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.loadDocuments(ConfigFileApplicationListener.java:544) ~[spring-boot-2.1.18.RELEASE.jar:2.1.18.RELEASE]
	at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.load(ConfigFileApplicationListener.java:499) ~[spring-boot-2.1.18.RELEASE.jar:2.1.18.RELEASE]
	... 28 more

然后我在重新build项目后再启动依然会报错,这时我们只需要在Maven中重新install就可以成功运行了
图片

<think>我们正在回答用户的问题:如何在Spring Boot项目中创建bootstrap.ymlapplication.yml文件 根据之前的回答,我们已经知道这两个文件的作用和区别。现在用户想知道如何具体创建它们。 步骤: 1. 确定项目结构:Spring Boot项目通常使用Maven或Gradle构建,配置文件放在src/main/resources目录下。 2. 创建文件:在src/main/resources目录下创建bootstrap.ymlapplication.yml文件。 3. 配置内容:根据需求填写配置内容,注意YAML语法(使用缩进,键值对等)。 4. 注意事项:bootstrap.yml需要Spring Cloud依赖,如果只是普通Spring Boot项目,可能不需要bootstrap.yml。 下面详细说明每一步:</think>### 如何在 Spring Boot 项目中创建 `bootstrap.yml` 和 `application.yml` 以下是创建和配置这两个核心配置文件的详细步骤,结合 Spring Boot 的加载机制和最佳实践: #### 1. **创建文件位置** - **路径要求**:所有配置文件必须放在项目的资源目录下: ```bash src/main/resources/ ``` - **创建方法**: - 在 IDE 中右键点击 `resources` 目录 → 新建文件 → 输入完整文件名 - 或手动创建文件: ```bash # 进入项目目录 cd your-project/src/main/resources # 创建文件 touch bootstrap.yml touch application.yml ``` #### 2. **文件内容配置** - **`bootstrap.yml`(优先加载)** 用于**启动初始化配置**(如配置中心连接): ```yaml spring: application: name: order-service # 应用名称(配置中心标识) cloud: config: uri: http://config-server:8888 # 配置中心地址 fail-fast: true # 启动时配置中心不可用则报错 ``` > ⚠️ 注意:需添加 Spring Cloud 依赖才能生效(如 Maven 的 `spring-cloud-starter-config`)[^2]。 - **`application.yml`(主配置)** 用于**运行时配置**(如端口、数据库): ```yaml server: port: 8080 # 服务端口 spring: datasource: url: jdbc:mysql://localhost:3306/orders username: admin password: securePass123! logging: level: root: INFO # 日志级别 ``` #### 3. **配置加载顺序与优先级** | 文件 | 加载阶段 | 优先级 | 典型用途 | |------------------|----------------|--------|-----------------------------------| | `bootstrap.yml` | **最早加载** | 更高 | 配置中心连接、加密密钥初始化 | | `application.yml`| 应用上下文初始化 | 较低 | 端口、数据库、自定义业务配置 | - **关键规则**: - `bootstrap.yml` 的属性优先加载,但 `application.yml` 可覆盖**非初始化属性**(如 `server.port`)[^1][^2] - 若同时存在 `application.properties`,YAML 文件优先级更高 #### 4. **环境差异化配置** 通过 `spring.profiles.active` 指定环境: ```yaml # application.yml spring: profiles: active: dev # 激活dev环境配置 ``` 创建环境专属文件(如 `application-dev.yml`),其配置会覆盖主配置[^2]。 #### 5. **验证配置生效** - 启动时查看日志: ```bash 2023-08-01 INFO o.s.c.b.BootstrapApplicationListener - Using bootstrap properties [...] 2023-08-01 INFO o.s.b.w.e.t.TomcatWebServer - Tomcat started on port(s): 8080 ``` - 测试配置中心连接:若 `bootstrap.yml` 中配置了 Config Server,启动时会优先拉取远程配置 #### 6. **常见问题解决** - **问题**:`bootstrap.yml` 未生效 **解决**:检查是否添加 Spring Cloud 依赖[^2]: ```xml <!-- Maven 示例 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> ``` - **问题**:YAML 语法错误 **解决**:使用 [YAML 校验工具](https://yamlvalidator.com/) 检查缩进(必须用空格,不能用 Tab) > **最佳实践**: > - 敏感信息(如数据库密码)应通过 `bootstrap.yml` 从配置中心获取 > - 本地开发时可用 `application-dev.yml` 覆盖生产配置 > - 多环境部署时用命令行参数指定配置:`java -jar app.jar --spring.profiles.active=prod`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值