仅通过@Value注入属性的映射

20 浏览
0 Comments

仅通过@Value注入属性的映射

如何使用@Values注解填充一个值的映射,而不需要在applicationContext.xml或任何其他XML文件中定义任何内容。我正在使用Spring Boot,它没有任何XML文件,我也不想要任何XML文件,所以请不要告诉我在XML中声明任何属性读取器bean等。

此外,这是一个属性注入的问题 - 请不要建议使用数据库来存储数据 - 这不是一个答案,对于我的情况也不可能。

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

我尝试声明这个注入:

@Value("${myprop}")
Map map;

和这个

@Value("${myprop.*}")
Map map;

使用这些条目application.properties

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

然后尝试

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

但是不起作用 - 弹出以下错误信息:

Could not autowire field: ... Could not resolve placeholder 'myprop'

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

是否有一种自动从多个属性构建映射的方法?

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

0
0 Comments

问题出现的原因:使用@Value注解无法直接将属性文件中的属性注入到Map中。

解决方法:

1. 在Java配置中定义一个bean,用于将属性文件中的属性注入到Map中。

2. 在类中使用Map类型的变量来接收注入的属性。

具体实现如下:

首先,在Java配置类中定义一个方法,用于将属性文件中的属性注入到Map中:

public Map myProps(Properties properties) {
  Map map = new HashMap<>();
  // 实现从属性文件中将属性注入到map的逻辑
  return map;
}

然后,在需要使用属性的类中声明一个Map类型的变量来接收注入的属性:

Map map;

这样就可以将属性文件中的属性注入到Map中,而不是注入System.getProperties()。

0
0 Comments

在Spring应用程序中,通过@Value注解注入一个属性的映射时,可能会遇到一个问题。原因是Spring默认情况下无法直接将属性的映射注入到一个Map中。解决这个问题的方法是在application.properties文件中设置属性的值,并使用@Value注解将其注入到一个Map中。

具体的解决方法如下:

1. 在application.properties文件中添加以下内容:

myprop = "{1:'One',2:'Two',3:'Three'}"

这里将属性myprop设置为一个映射,其中键为整数,值为字符串。

2. 在Spring应用程序中的相应位置添加以下代码:

@Value("#{'${myprop}'}")
Map map;

这里使用@Value注解将属性myprop注入到一个Map对象中。注意,需要使用#{'${myprop}'}的形式将属性引用起来,并指定Map的类型。

通过以上步骤,就可以实现通过@Value注解将属性的映射注入到一个Map中,解决了这个问题。这样,在Spring应用程序中就可以直接使用这个Map对象来获取属性的值。

0
0 Comments

问题的出现原因:

在这个问题中,用户需要将.properties文件中的键值对注入到一个Map中。用户尝试使用@Value注解来完成注入,但是并没有成功。

解决方法:

用户可以通过以下步骤来解决这个问题:

1. 创建一个Config类,在该类中加载.properties文件,并将其作为java.util.Properties对象进行处理。

2. 创建一个MyBean类,在该类中使用SPeL注解将Properties对象注入到Map中。

3. 最后,用户不需要使用xml文件,而是需要使用PropertiesFactoryBean来加载.properties文件,并通过@Value注解将Properties对象注入到Map中。

代码如下:

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();
    }
}
public class MyBean {
    @Value("#{mapper}")
    private Map props;
    public Map getProps() {
        return props;
    }
}

通过以上步骤,用户可以成功将.properties文件中的键值对注入到一个Map中,而无需手动解析值。希望这能对你有所帮助。

0