【问题标题】:How to inject array in properties file using Spring如何使用 Spring 在属性文件中注入数组
【发布时间】:2018-03-01 14:58:30
【问题描述】:

我正在使用 SpringBoot "1.5.10.RELEASE" 来管理 .properties 文件,如下所示:

#Queue1
br.net.enterprise.server.name.1=server1.company.net
br.net.enterprise.server.port.1=4416
br.net.enterprise.server.protocol.1=t3
br.net.enterprise.server.queue.1=DistributedQueue-ERROR
br.net.enterprise.server.sampleRateMinutes.1=2
#Queue2
br.net.enterprise.server.name.2=a.b.c.d
br.net.enterprise.server.port.2=12234
br.net.enterprise.server.protocol.2=t4
br.net.enterprise.server.queue.2=DistributedQueue-ABC
br.net.enterprise.server.sampleRateMinutes.2=5

这样我就可以拥有“n”个队列配置。 在我的 java 文件中,我会得到这个:

@Value("${br.net.enterprise.server.name}")
private List<String> names;
@Value("${br.net.enterprise.server.port}")
private List<String> ports;

有没有办法让这种行为与 spring 和 Properties 文件一起工作?

提前致谢。

【问题讨论】:

  • 可以用yml文件代替属性吗?
  • 是的,如果我能保持这种配置风格(server1 和 server2 隔离)。

标签: java spring spring-boot-actuator


【解决方案1】:

你可以使用@ConfigurationProperties

像这样改变你的属性

#Queue1
br.net.enterprise.server.1.name=server1.company.net
br.net.enterprise.server.1.port=4416
br.net.enterprise.server.1.protocol=t3
br.net.enterprise.server.1.queue=DistributedQueue-ERROR
br.net.enterprise.server.1.sampleRateMinutes=2
#Queue2
br.net.enterprise.server.2.name=a.b.c.d
br.net.enterprise.server.2.port=12234
br.net.enterprise.server.2.protocol=t4
br.net.enterprise.server.2.queue=DistributedQueue-ABC
br.net.enterprise.server.2.sampleRateMinutes=5

像这样声明两个类

@Configuration
@Getter
@Setter
public class QueueConfig {

  private String name;
  private String port;
  private String protocol;
  private String queue;
  private String sampleRateMinutes;

}


@Configuration
@Getter
@Setter
@ConfigurationProperties(prefix = "br.net.enterprise")
public class MyConfig {
  Map<Integer, QueueConfig> server;
}

这将创建一个这样的地图

将 1 和 2 更改为属性文件中有意义的内容。这将是地图中的键,您可以从中读取。

【讨论】:

    【解决方案2】:

    您需要存储由一些字符 ex 分隔的值。逗号分隔

    br.net.enterprise.server.name =server1.company.net,server2.company.net,server3.company.net
    

    然后以这种方式阅读:

     @Value("#{'${br.net.enterprise.server.name}'.split(',')}") 
     private List<String> names;
    

    【讨论】:

    • 我明白,我试图避免这种风格,因为我正在使用相关参数,例如服务器名称、端口等,如果我能够设法将这些相关信息放在一起,那就不会那么混乱了。
    猜你喜欢
    • 1970-01-01
    • 2019-06-04
    • 2014-09-09
    • 2018-10-15
    • 2017-03-18
    • 2013-07-01
    • 2011-08-21
    • 1970-01-01
    • 2017-06-17
    相关资源
    最近更新 更多