2014-12-11 683 views
19

.yml文件@ConfigurationProperties没有前缀的工作

cassandra: 
    keyspaceApp:junit 
solr: 
    keyspaceApp:xyz 

@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 =“卡桑德拉”不工作

+0

您正在使用什么春/启动的版本? – 2014-12-12 07:26:07

回答

34

看起来你正在尝试使用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启动时使用一个默认的配置文件。

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

@Component 
@ConfigurationProperties(prefix="cassandra") 
public class CassandraClientNew { 
    private String keyspaceApp; 

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

顺便说一句,如果要使用List的或Set秒和你初始化集合(例如List<String> values = new ArrayList<>();),则仅吸气剂是必需的。如果一个集合没有被初始化,那么你也需要提供一个setter方法(否则会抛出异常)。

我希望这会有所帮助。

+0

Thx,它真的帮了大忙!我的问题确实是缺席的二传手!但我有点困惑:春天教会我们不要对所有访问器和修饰符都不屑一顾,突然之间它不能注入财产而没有二传手......这不是很奇怪吗? – vk23 2017-06-22 19:52:37

1

我不知道在哪里的“XYZ”是从哪里来的(也许你没有显示你的整个application.yml?)。尽管(你无法知道你的前缀是什么),你通常不会与@Value@ConfigurationProperties中绑定。你真的在任何地方都有@EnableCongigurationProperties吗?您是否使用SpringApplication来创建应用程序上下文?

+0

添加了更多信息。让我知道如果这有帮助与否。 – plzdontkillme 2014-12-11 08:09:44

+0

希望看到@value可以将默认值分配给属性 – plzdontkillme 2014-12-11 08:44:03

+1

您可以自己分配默认值,如果属性匹配,则该值将被覆盖。 – 2014-12-11 09:09:26