春季启动@ConfigurationProperties无法正常工作

时间:2019-01-22 05:16:21

标签: spring spring-boot autowired spring-annotations jsr330

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

配置类:

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

private String base;

public String getBase() {
    return base;
}

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

主类:

@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位置类,我会看到一个实例已创建。但是没有属性设置。该代码未输入setBase()方法。

应用程序在控制台中打印出来。

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

2 个答案:

答案 0 :(得分:1)

确保application.yml文件位于类路径的根目录中,通常将其放置在resources文件夹中。

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

M。Deinum的评论是正确的,说您重复的注释将为Location类产生2个spring bean。但是,正如您所说的那样,您成功地自动装配了bean而没有出现错误,这表明您的Location类不在Spring扫描bean时发现的软件包中。如果有2个bean,则在自动装配时会出现错误。默认情况下,spring将使用@SpringBootApplication作为基础的软件包进行扫描。然后它将查看此软件包和所有子软件包。

如果您的包裹结构是这样的...

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

然后,您需要在scanBasePackages="myapp"注释中添加@SpringBootApplication

还可以更改您的主类并删除@Enable ..批注。即:

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

    public static void main(String[] args) {

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

答案 1 :(得分:-1)

由于yaml无法正常工作,我不得不更改为属性文件并使用

  

@PropertySource({“ classpath:application.properties”})

用于弹簧识别属性文件