IDEA的Springboot工程手动正确配置了yml配置文件无法识别并获取其中的属性,换回properties文件就能识别上了

一、问题场景

最近在学习springboot框架自定义starter时碰上一个问题,场景如下:

三个模块 aliyun-oss-spring-boot-starter(简写starter)、aliyun-oss-spring-boot-autoconfiguration(简写auto)和springboot-autoconfiguration-test (简写test)分别为阿里云oss功能的依赖管理模块、将图片上传至oss的具体功能实现模块和测试模块。(目录结构如下)

二、具体实现

starter:(pom.xml)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.itheima</groupId>
    <artifactId>aliyun-oss-spring-boot-starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>aliyun-oss-spring-boot-starter</name>
    <description>aliyun-oss-spring-boot-starter</description>
    <url/>

    <licenses>
        <license/>
    </licenses>

    <developers>
        <developer/>
    </developers>

    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>

    <properties>
        <java.version>17</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!--        引入阿里云configuration包-->
        <dependency>
            <groupId>com.itheima</groupId>
            <artifactId>aliyun-oss-spring-boot-configuration</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>


</project>
auto:
AliOSSProperties.java:

(复制封装阿里云oss的对应容器信息,从配置文件中读入)

package com.itheima;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;


@Data
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
    private String endpoint;
    private String bucketName;
}
application.yml文件:

(我在使用此文件作为配置文件的时候,是将默认生成且优先级更高的properties文件删除了的)

aliyun:
  oss:
    endpoint: https://oss-cn-hangzhou.aliyuncs.com
    bucket-name: my
application.properties文件: 
aliyun.oss.bucket-name=my
aliyun.oss.endpoint=https://oss-cn-hangzhou.aliyuncs.com
AliOSSUtils.java:
package com.itheima;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyuncs.exceptions.ClientException;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;

/**
 * 阿里云 OSS 工具类
 */
@Data
public class AliOSSUtils {


    private AliOSSProperties aliOSSProperties;

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException, ClientException {
        String endpoint = aliOSSProperties.getEndpoint();
        String bucketName = aliOSSProperties.getBucketName();
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint,credentialsProvider);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

    public AliOSSProperties getAliOSSProperties() {
        return aliOSSProperties;
    }

    public void setAliOSSProperties(AliOSSProperties aliOSSProperties) {
        this.aliOSSProperties = aliOSSProperties;
    }
}
AliOSSAutoConfiguration.java:

此类为自动配置类,负责生成工具类AliOSSUtils并将其交由springboot的ioc容器管理

package com.itheima;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
@EnableConfigurationProperties(AliOSSProperties.class)
public class AliOSSAutoConfiguration {

    @Bean
    public AliOSSUtils aliOSSUtils(AliOSSProperties aliOSSProperties){
        AliOSSUtils aliOSSUtils=new AliOSSUtils();
        aliOSSUtils.setAliOSSProperties(aliOSSProperties);
        return aliOSSUtils;
    }
}
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.itheima</groupId>
    <artifactId>aliyun-oss-spring-boot-configuration</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>aliyun-oss-spring-boot-configuration</name>
    <description>aliyun-oss-spring-boot-configuration</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

<!--        引入lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

<!--        引入web起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--阿里云OSS依赖-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.17.4</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>

        <!-- no more than 2.3.3-->
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.3</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>



    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
test:
UploadController类:

(一个简单的处理请求的类,注入阿里云工具类AliOSSUtils实现上传功能)

package com.itheima.controller;

import com.itheima.AliOSSUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
public class UploadController {

    @Autowired
    AliOSSUtils aliOSSUtils;

    @PostMapping("/upload")
    public String upload(MultipartFile image) throws Exception {
        //上传文件到阿里云 OSS
        String url= aliOSSUtils.upload(image);
        return url;
    }

}

然后还有一个springboot工程的启动类,pom.xml文件中引入了starter模块,相当于自动将starter和auto两个模块的依赖都引入了,直接能使用上传到阿里云oss的功能了。

三、运行测试

1、启动项目:

使用两种配置文件均成功启动无报错。

2、postman测试:

(文件大小五十几KB不大)

a、properties文件时:

如下图,正常获得由oss容器自动生成的图片的URL

b、yml文件时:

注释properties文件,配置yml文件:

postman再次发送测试:

发现报500错误。调试时发现:是这个属性类没有从配置文件成功拿到对应的属性,导致之后的一个方法报空指针异常。

怀疑是ConfigurationProperties注解失效,把网上翻了个底朝天,最后找到一个帖子如下:

尝试将yml文件换回properties就好了。

四、总结

虽然问题解决了,但是还是不知道原因,大佬们有谁知道吗!!!?

解决问题的原文链接:https://www.cnblogs.com/qq3245792286/p/16229675.html

### 关于Spring Boot项目中无法解析配置属性 'spring' 的解决方案 在开发过程中遇到 `Cannot resolve configuration property` 错误通常是因为某些依赖未正确加载或者插件功能受限所致。以下是针对该问题的具体分析与解决措施: #### 1. 检查依赖项是否完整 确保项目的 `pom.xml` 或 `build.gradle` 文件中包含了必要的 Starter 和 Configuration Processor 依赖。Configuration Processor 是用于处理 Spring Boot 配置元数据的核心工具[^1]。 对于 Maven 用户,需确认以下依赖已存在: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> ``` 对于 Gradle 用户,则应添加如下内容: ```gradle dependencies { annotationProcessor('org.springframework.boot:spring-boot-configuration-processor') } ``` #### 2. 更新 IDE 插件重启缓存 有时 IntelliJ IDEA 中的 Spring Boot 插件可能未能完全支持最新的框架版本。此时可以尝试更新插件至最新版,通过清理缓存来解决问题[^4]。 操作步骤如下: - 打开 **File -> Invalidate Caches / Restart...** - 选择 **Invalidate and Restart** #### 3. 多数据源场景下的特殊处理 如果项目涉及动态切换数据库或多数据源设置(如案例中的 `dynamic.datasource.master.driverClassName`),则需要额外引入相关扩展库以增强对复杂配置的支持能力[^2]。 推荐使用的第三方组件为 `com.baomidou.dynamic-datasource-spring-boot-starter` ,其能够简化多数据源管理流程减少潜在冲突风险。 安装方式同样取决于构建工具类型: Maven 示例代码片段: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.x.x</version><!--具体版本号依据实际需求而定--> </dependency> ``` Gradle 对应写法: ```groovy implementation 'com.baomidou:dynamic-datasource-spring-boot-starter:3.x.x' // 版本号同上说明一致 ``` 完成上述调整之后重新编译整个工程即可消除大部分因路径映射不清所引发的告警信息。 #### 4. 调整 Lombok 使用策略 (可选) 部分开发者反馈当同时启用 Lombok 注解处理器时可能会干扰到原有机制正常运作从而造成异常现象发生。因此建议暂时禁用或替换掉它再做进一步验证测试看是否存在关联影响因素[^3]。 --- ### 总结 综合以上几点可以看出,“cannot resolve configuration property” 类型错误往往源于以下几个方面的原因:缺少关键性的辅助类库导入;或是由于特定环境设定不当引起的功能局限性表现出来而已。按照本文介绍的方法逐一排查应该能有效缓解乃至彻底根除此类困扰情况的发生几率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值