Spring 如何传递地图<;字符串,字符串>;使用application.properties

Spring 如何传递地图<;字符串,字符串>;使用application.properties,spring,spring-boot,Spring,Spring Boot,我已经在需要配置的Web服务中实现了一些授权 目前,用户/密码组合已硬编码到bean配置中。我想在application.properties中配置带有用户和密码的映射,以便配置可以是外部的 关于如何做到这一点有什么线索吗 <bean id="BasicAuthorizationInterceptor" class="com.test.BasicAuthAuthorizationInterceptor"> <property name="users">

我已经在需要配置的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>

我想您正在寻找类似的产品

您可以类似地从.properties中选取值并将其分配给映射。

对象已经是一个
映射
,实际上是一个
哈希表
,它反过来实现了
映射

因此,当您创建属性文件(将其命名为
users.properties
)时,您应该能够使用
PropertiesFactoryBean
加载它,并将其注入到您的类中

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>


虽然若将
映射作为用户属性的一种类型,它可能会失败。。。我不会把它们放在
application.properties
文件中。但那可能就是我。

您可以使用
@ConfigurationProperties
应用程序.properties中的值绑定到bean中。为此,请注释创建Bean的
@Bean
方法:

@Bean
@配置属性
公共基本授权拦截器拦截器(){
返回新的BasicAuthorizationInterceptor();
}
作为bean初始化的一部分,
basicAuthorizationInterceptor
上的任何属性都将根据应用程序的环境进行设置。例如,如果这是bean的类:

public class BasicAuthAuthorizationInterceptor {

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

    public Map<String, String> getUsers() {
        return this.users;
    }
}
然后,
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;
        }
    }
}
要使绑定正常工作,您必须在application.properties中声明的属性上使用相同的前缀:

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

您可以使用
@Value

属性文件:

users={test1:'test1',test2:'test2'}
Java代码:

@Value("#{${users}}")
private Map<String,String> users;
@Value(“{${users}”)
私人地图用户;

请注意,您的bean应该有一个getter,以便spring能够填充映射,而公共字段是不够的。@MeysaM您是否误读了代码?BasicAuthorizationInterceptor已经有了一个
getUsers()
方法,
users
字段是
private
,而不是
public
。不,这只是提醒其他人不要重复我的错误。你的代码运行得非常好。这比公认的答案要好。这正是我要找的
metrics.tagsAsSuffix.jvm.gc=
metrics.tagsAsSuffix.jvm.threads=
不会被读入
Map
中,但
metrics.tagsAsSuffix.jvm
=空列表。后缀的其余部分被去掉了这很好!如何从application.yml文件中读取地图@如果我们使用application.yml文件而不是application.properties文件来读取属性,那么Value(“{${users}}”)不起作用。假设我有50个这样的属性,那么我不能继续添加50次
@Value(“{${users}”)
,如果我们可以就地读取,有什么方法吗?或者一次阅读?假设我有将近50个端点,我不能继续添加
@Value(“{${users}”)
,我需要一次阅读所有内容。不确定为什么这个答案被接受。这就像spring boot world中的魅力一样,特别是如果我的值是string[]或custom类,如何读取?例如:
私人地图用户
私人地图用户
@Value("#{${users}}")
private Map<String,String> users;