【问题标题】:Injecting a map of properties via @Value alone仅通过 @Value 注入属性映射
【发布时间】:2014-10-03 21:30:23
【问题描述】:

如何使用@Values 注解填充值映射,无需在 applicationContext.xml 中定义任何内容 或任何其他 XML 文件。

我使用的是spring boot,它没有任何 XML文件,我也不想要任何XML文件,所以请不要告诉我在XML等中声明任何属性阅读器bean .

另外,这是一个属性注入问题 - 请不要建议使用数据库来存储数据 - 这不是答案,而且无论如何都不适合我的情况。

另外,我也不能使用 YAML(由于部署/操作要求)。

我已尝试声明此注入:

@Value("${myprop}")
Map<Integer, String> map;

还有这个

@Value("${myprop.*}")
Map<Integer, String> map;

这些条目application.properties:

myprop.1=One
myprop.2=Two
myprop.3=Three

然后尝试

myprop[1]=One
myprop[2]=Two
myprop[3]=Three

但不好 - 只是爆炸

无法自动装配字段:...无法解析占位符“myprop”

我找到了一个解决方法,将注入的String[] 指定为key1:value1,key2:value2,...,然后我在代码中解析它,但我不想这样做,因为a)它是更多代码,b)列表是会很长,一行中的所有对都将难以阅读和维护。

有没有办法从多个属性自动构建地图?

我不在乎属性名称是什么,字段类型或注解是什么;我只是想为每个属性注入一个键/值对。

【问题讨论】:

  • 据我所知,没有内置配置。这似乎是一个非常具体的用例。 Map 的键是否与 * 匹配的所有内容匹配?
  • @SotiriosDelimanolis 那是我的意图。虽然我不在乎属性的格式是什么;只要它是每行一个键/值对,它可以是任何格式、任何字段类型、任何注释。我应该补充一点,我也不可能使用 YAML。
  • @stan 谢谢,但链接的答案使用 XML 来声明自定义属性加载器,根据我问题第一行中的粗体字,这不是一个有用的答案
  • 你解决了吗?

标签: java spring properties


【解决方案1】:

不确定这是否完全适用于你的场景(你有一个Map&lt;Integer, String&gt;,但最后你说你只需要一个 Map 中的键值对),但也许它可以给你更多的想法:

  • 假设是一个@Configuration 类,其中.properties 文件作为java.util.Properties 对象加载:
@Configuration
public class Config {

    @Bean(name = "mapper")
    public PropertiesFactoryBean mapper() {
        PropertiesFactoryBean bean = new PropertiesFactoryBean();
        bean.setLocation(new ClassPathResource("META-INF/spring/application.properties"));
        return bean;
    }

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}
  • MyBean 类正在使用这些 Properties,使用 SPeL 注入:
public class MyBean {

    @Value("#{mapper}")
    private Map props;

    public Map getProps() {
        return props;
    }
}

所以,最终你不使用 xml(当然),你需要使用 PropertiesFactoryBean 来加载 .properties 文件,并且使用 @Value,Spring 会将 Properties 注入 Map .额外的代码(可能与@PropertySource 相比)是PropertiesFactoryBean,您无需手动解析代码中的值(与注入String[] 的解决方法相比)。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    在您的 Java 配置中为此定义一个 bean 怎么样?

    @Bean
    public Map<Integer, String> myProps(Properties properties) {
      Map<Integer, String> map = new HashMap<>();
    
      // implement logic to populate map from properties
    
      return map;
    }
    

    在你的课堂上:

    @Autowirded
    Map<Integer, String> map;
    

    【讨论】:

    • 这是注入System.getProperties(),而不是属性文件的内容
    猜你喜欢
    • 2012-11-21
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2018-02-16
    • 1970-01-01
    • 2020-06-13
    • 2011-10-31
    相关资源
    最近更新 更多