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

Mar*_*rco 18 spring spring-boot

我已在需要配置的Web服务中实现了一些授权.

目前,用户/密码组合被硬编码到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>
Run Code Online (Sandbox Code Playgroud)

And*_*son 41

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

@Bean
@ConfigurationProperties
public BasicAuthAuthorizationInterceptor interceptor() {
    return new BasicAuthAuthorizationInterceptor();
}
Run Code Online (Sandbox Code Playgroud)

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

public class BasicAuthAuthorizationInterceptor {

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

    public Map<String, String> getUsers() {
        return this.users;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是你的application.properties:

users.alice=alpha
users.bob=bravo
Run Code Online (Sandbox Code Playgroud)

然后users地图将填充两个条目:alice:alpha和bob: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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@ConfigurationProperties(prefix="foo")
Run Code Online (Sandbox Code Playgroud)

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

foo.users.alice=alpha
foo.users.bob=bravo
Run Code Online (Sandbox Code Playgroud)

  • 不,这只是提醒其他人不要重蹈我的覆辙。你的代码工作得非常好。 (2认同)

Mar*_*nes 37

你可以使用@Value.

属性文件:

users={test1:'test1',test2:'test2'}
Run Code Online (Sandbox Code Playgroud)

Java代码:

@Value("#{${users}}")
private Map<String,String> users;
Run Code Online (Sandbox Code Playgroud)


M. *_*num 6

一个java.util.Properties对象已经是一个Map,实际上是一个对象HashTable实现的对象Map.

因此,当您创建属性文件(让我们命名users.properties)时,您应该能够使用PropertiesFactoryBeanor 加载它<util:properties />并将其注入您的类.

test1=test1
test2=test2
Run Code Online (Sandbox Code Playgroud)

然后做类似的事情

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

<bean id="BasicAuthorizationInterceptor" class="com.test.BasicAuthAuthorizationInterceptor">
    <property name="users" ref="users" />
</bean>
Run Code Online (Sandbox Code Playgroud)

虽然如果你有一个Map<String, String>user属性的类型,它可能会失败...我不会把它们放在application.properties文件中.但那可能就是我......