Spring 启动@ConfigurationProperties 不工作

Spring boot @ConfigurationProperties not working

我正在使用 @ConfigurationProperties 自动配置属性。我的代码在 IDE 中运行。但是当我在命令行中 运行 jar 时,它不起作用。

配置class:

@Configuration
@ConfigurationProperties(prefix="location")
public class Location {

private String base;

public String getBase() {
    return base;
}

public void setBase(String base) {
    this.base = base;
}
}

主要class:

@SpringBootApplication
@EnableConfigurationProperties(Location.class)
@EnableAutoConfiguration
public class Application {

public static void main(String[] args) {

    SpringApplication.run(Application.class, args);
}
}

application.yml:

location:
 base: c:\test

如果我 autowire 位置 class,我会看到创建了一个实例。但是没有属性设置。代码未进入 setBase() 方法。

应用程序在控制台中打印此信息。

AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' 
annotation found and supported for autowiring

确保 application.yml 文件位于 class 路径的根目录中,通常它位于资源文件夹中。

未调用 setBase() 方法这一事实表明未找到您的 application.yml 文件。 Spring 在 class 路径的根目录中查找 application.yml 文件。

M. Deinum 的评论是正确的,您的重复注释将导致位置 class 的 2 spring 个 bean。但是,正如您所说,您成功地自动装配了 bean 而没有出现错误,这表明您的位置 class 不在 spring 扫描 bean 时找到的包中。如果有 2 个 bean,那么在自动装配它时会出现错误。默认情况下 spring 将使用 @SpringBootApplication 作为基础的包进行扫描。然后它将查看这个包和所有子包。

如果你的包结构是这样的...

myapp.main
    Application.java
myapp.config
    Location.java

然后需要在@SpringBootApplication注解中加上scanBasePackages="myapp"

同时更改您的主要 class 并删除 @Enable.. 注释。即:

@SpringBootApplication(scanBasePackages="myapp")
public class Application {

    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);
    }
}

由于 yaml 无效,我不得不更改为 属性 文件并使用

@PropertySource({"classpath:application.properties"})

为spring识别属性文件