0

我正在使用@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);
}
}

应用程序.yml:

location:
 base: c:\test

如果我autowire使用 Location 类,我会看到创建的实例。但是没有设置属性。代码未输入setBase()方法。

应用程序将其打印在控制台中。

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

2 回答 2

1

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

未调用 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.. 注释。IE:

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

    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);
    }
}
于 2019-01-22T11:36:45.313 回答
-1

由于 yaml 没有任何效果,我不得不更改为属性文件并使用

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

用于弹簧识别属性文件

于 2019-01-22T21:35:45.460 回答