如何使用弹簧从属性文件加载地图

Posted

技术标签:

【中文标题】如何使用弹簧从属性文件加载地图【英文标题】:how to load map from properties file with spring 【发布时间】:2015-04-14 05:36:56 【问题描述】:

我正在尝试将 .properties 文件中的地图加载到 HashMap

属性文件有以下内容:

try.map= one=1,\
two=2

代码:

@org.springframework.beans.factory.annotation.Value("$try.map")
HashMap<String, String> tryMap;

将属性加载到地图会导致:

 java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [java.util.HashMap]: no matching editors or conversion strategy found

任何想法如何为此创建映射策略?

【问题讨论】:

您有自己的转换器并将其添加到coverationService。 【参考方案1】:

没有默认的转换器。所以你必须编写自己的转换器并将其注册到conversationService。

这里是一个基于注释的示例:

@Bean(name="conversionService") 
public static ConversionService getConversionService()
    ConversionServiceFactoryBean conversionServiceFactoryBean = new ConversionServiceFactoryBean();
    Set<Converter<?,?>> converters = new HashSet<Converter<?,?>>();
    converters.add(new StringToHashMapConverter());
    conversionServiceFactoryBean.setConverters(converters);
    conversionServiceFactoryBean.afterPropertiesSet();
    return conversionServiceFactoryBean.getObject();

转换器:

import java.util.HashMap;

import org.springframework.core.convert.converter.Converter;

public class StringToHashMapConverter implements Converter<String,HashMap> 

    @Override
    public HashMap convert(String paramS) 
           //do the coversion
    


【讨论】:

@Gleeb 你能解释一下原因吗? 仍然出现同样的错误。我的应用程序中有一个对话服务。我将通过确认更新问题,可能配置不正确 如果转换器被调用,你能尝试调试你的代码吗?请检查您是否在项目中使用注解配置。 好的,这可行,但存在一个问题,在某些地方,一些配置文件在转换服务 bean 之前加载,我如何保证转换服务在任何其他 bean 之前加载? 我认为 spring 会在创建 bean 之前加载转换器。所以你不能有这样的情况。如果您遇到问题,您可以使用@DependsOn 注释来保证会话服务在 bean 之前加载。希望这会有所帮助。【参考方案2】:

我也遇到了这个错误。如果您想在不付出太多努力的情况下解决它,只需正确检查您的导入即可。 如果您导入错误的文件,大多数情况下您会收到此错误。对于您,我认为您在文件中导入了错误的 HashMap。检查它应该是 java.util.HashMap。

【讨论】:

【参考方案3】:

这对我有用:

try.map= \
  one: 1,\
  two: 2\

代码:

@org.springframework.beans.factory.annotation.Value("#$try.map")
HashMap<String, String> tryMap;

是的,语法很奇怪。

这篇 SO 帖子有更多信息: How to fill HashMap from java property file with Spring @Value

【讨论】:

以上是关于如何使用弹簧从属性文件加载地图的主要内容,如果未能解决你的问题,请参考以下文章

我想阅读具有地图地图的弹簧属性文件

从属性文件中读取列表并使用弹簧注释@Value 加载

从属性文件中读取列表并使用弹簧注释@Value 加载

使用spring boot loader WarLauncher时如何在war文件之外加载属性文件?

如何从多个文件中收集弹簧属性以在单个 bean 上使用

关闭或停止后重新加载弹簧上下文