@ConfigurationProperties前缀不起作用

时间:2014-12-11 05:58:55

标签: java spring spring-boot

.yml文件

cassandra:
    keyspaceApp:junit
solr:
    keyspaceApp:xyz

Bean

@Component
@ConfigurationProperties(prefix="cassandra")
public class CassandraClientNew {
   @Value("${keyspaceApp:@null}") private String keyspaceApp;

主要方法文件

@EnableAutoConfiguration
@ComponentScan
@PropertySource("application.yml")
public class CommonDataApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = new SpringApplicationBuilder(CommonDataApplication.class)
                .web(false).headless(true).main(CommonDataApplication.class).run(args);
    }
}

TestCase

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = CommonDataApplication.class)
@IntegrationTest
@EnableConfigurationProperties
public class CassandraClientTest {

    @Autowired
    CassandraClientNew cassandraClientNew;

    @Test
    public void test(){
        cassandraClientNew.getSession();
        System.out.println(" **** done ****");
    }
}

不是将junit设置为keyspaceApp,而是设置xyz。

看起来像prefix =“cassandra”无效

4 个答案:

答案 0 :(得分:44)

您似乎正在尝试使用Spring Boot Typesafe Configuration Properties功能。

因此,为了使其正常工作,您必须为代码添加一些更改:

首先,您的CommonDataApplication课程应该有@EnableConfigurationProperties个注释,例如

@EnableAutoConfiguration
@ComponentScan
@PropertySource("application.yml")
@EnableConfigurationProperties
public class CommonDataApplication {

    public static void main(String[] args) {
        // ...
    }
}

我认为您不需要@PropertySource("application.yml")注释application.yml(以及application.propertiesapplication.xml)是Spring Boot使用的默认配置文件。

您的CassandraClientNew课程不需要@Value注释前缀keyspaceApp属性。您的keyspaceApp 必须有一个setter方法

@Component
@ConfigurationProperties(prefix="cassandra")
public class CassandraClientNew {

   private String keyspaceApp;

   public void setKeyspaceApp(final String keyspaceApp) {
       this.keyspaceApp = keyspaceApp;
   }
}

顺便说一句,如果您使用的是ListSet并且初始化集合(例如List<String> values = new ArrayList<>();),那么只需要getter。如果未初始化集合,则还需要提供setter方法(否则将抛出异常)。

我希望这会有所帮助。

答案 1 :(得分:2)

我不知道&#34; xyz&#34;来自(也许你没有显示你的整个application.yml?)。您通常不会在@Value中与@ConfigurationProperties绑定(它无法知道您的前缀是什么)。你真的在@EnableCongigurationProperties的任何地方吗?您使用SpringApplication创建应用程序上下文吗?

答案 2 :(得分:0)

http://www.baeldung.com/configuration-properties-in-spring-boot

这仅适用于SB 1.5.4-RELEASE。这很简单。有关详细信息,请参阅上面的帖子。

@Configuration @ConfigurationProperties(prefix = "mail") public class ConfigProperties

答案 3 :(得分:0)

一般答案

1。在您的属性文件(application.properties或application.yml)中

# In application.yaml
a:
  b:
    c: some_string

2。宣布您的课程:

@Component
@ConfigurationProperties(prefix = "a", ignoreUnknownFiels = false)
public class MyClassA {

  public MyClassB theB;   // This name actually does not mean anything
                          // It can be anything      
  public void setTheB(MyClassB theB) {
    this.theB = theB;
  }

  public static MyClassB {

    public String theC;

    public void setTheC(String theC) {
      this.theC = theC;
    }

  }

}

3。宣布公众的二传手!这很关键!

确保在上述类中声明了这些公共方法。确保它们具有“公共” 修饰符。

// In MyClassA
public void setTheB(MyClassB theB) {
  this.theB = theB;
}

// In MyClassB
public void setTheC(String theC) {
  this.theC = theC;
}

就是这样。

最后的笔记

  • 类中的属性名称对Spring没有任何意义。它仅使用公共二传手。我宣布他们是公开的,而不是在这里宣布公众的吸气剂。您的媒体资源可能具有任何访问修饰符。
  • 请注意属性“ ignoreUnknownFields”。其默认值为“ true”。如果为“ false”,则如果文件“ application.yml”中的任何属性未绑定到任何类属性,它将引发异常。它将在调试过程中为您提供很多帮助。