如何使用application.properties </string,string>传递map <string,string>

时间:2014-10-09 10:10:04

标签: spring spring-boot

我已在需要配置的网络服务中实施了一些授权。

目前,用户/密码组合已硬编码到bean配置中。我想将带有用户和密码的地图配置到application.properties中,以便配置可以是外部的。

关于如何做到这一点的任何线索?

<bean id="BasicAuthorizationInterceptor" class="com.test.BasicAuthAuthorizationInterceptor">
    <property name="users">
        <map>
            <entry key="test1" value="test1"/>
            <entry key="test2" value="test2"/>
        </map>
    </property>
</bean>

4 个答案:

答案 0 :(得分:40)

您可以使用@ConfigurationPropertiesapplication.properties中的值绑定到bean中。为此,您需要注释创建bean的@Bean方法:

@Bean
@ConfigurationProperties
public BasicAuthAuthorizationInterceptor interceptor() {
    return new BasicAuthAuthorizationInterceptor();
}

作为bean初始化的一部分,BasicAuthAuthorizationInterceptor上的任何属性都将根据应用程序的环境进行设置。例如,如果这是你的bean的类:

public class BasicAuthAuthorizationInterceptor {

    private Map<String, String> users = new HashMap<String, String>();

    public Map<String, String> getUsers() {
        return this.users;
    }
}

这是你的application.properties:

users.alice=alpha
users.bob=bravo

然后users地图将填充两个条目:alice:alphabob:bravo

这是一个小样本应用程序,将所有这些放在一起:

import java.util.HashMap;
import java.util.Map;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableAutoConfiguration
@EnableConfigurationProperties
public class Application {

    public static void main(String[] args) throws Exception {
        System.out.println(SpringApplication.run(Application.class, args)
                .getBean(BasicAuthAuthorizationInterceptor.class).getUsers());
    }

    @Bean
    @ConfigurationProperties
    public BasicAuthAuthorizationInterceptor interceptor() {
        return new BasicAuthAuthorizationInterceptor();
    }

    public static class BasicAuthAuthorizationInterceptor {

        private Map<String, String> users = new HashMap<String, String>();

        public Map<String, String> getUsers() {
            return this.users;
        }
    }
}

有关其各种配置选项的更多信息,请查看javadoc for ConfigurationProperties。例如,您可以设置前缀以将配置划分为多个不同的命名空间:

@ConfigurationProperties(prefix="foo")

要使绑定起作用,您必须在application.properties中声明的属性上使用相同的前缀:

foo.users.alice=alpha
foo.users.bob=bravo

答案 1 :(得分:31)

您可以使用@Value

属性文件:

users={test1:'test1',test2:'test2'}

Java代码:

@Value("#{${users}}")
private Map<String,String> users;

答案 2 :(得分:6)

java.util.Properties对象已经是Map,实际上是HashTable,后者又实现了Map

因此,当您创建属性文件(让我们将其命名为users.properties)时,您应该可以使用PropertiesFactoryBean<util:properties />加载它并将其注入您的班级。

test1=test1
test2=test2

然后执行类似

的操作
<util:properties location="classpath:users.properties" id="users" />

<bean id="BasicAuthorizationInterceptor" class="com.test.BasicAuthAuthorizationInterceptor">
    <property name="users" ref="users" />
</bean>

虽然如果你有一个Map<String, String>作为用户属性的类型,它可能会失败...我不会将它们放在application.properties文件中。但那可能只是我......

答案 3 :(得分:0)

我认为你正在寻找类似的东西

http://www.codejava.net/frameworks/spring/reading-properties-files-in-spring-with-propertyplaceholderconfigurer-bean

您可以类似地从.properties中选择值并将其指定给您的地图。