我正在使用@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
答案 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”})
用于弹簧识别属性文件