如何使用弹簧从属性文件加载地图
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
【讨论】:
以上是关于如何使用弹簧从属性文件加载地图的主要内容,如果未能解决你的问题,请参考以下文章