Spring 如何传递地图<;字符串,字符串>;使用application.properties
我已经在需要配置的Web服务中实现了一些授权 目前,用户/密码组合已硬编码到bean配置中。我想在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">
<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;