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识别属性文件
我正在使用 @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识别属性文件