在Spring中混合@Value的map和后备值

问题描述 投票:0回答:1

尝试在配置中获取可选地图,我尝试过

@Value("#{${my.prefix.mymap} }") Map<String, Integer> mymap

与属性文件中的

my.prefix.mymap={a=3, b=4}
一起使用,如果没有(在属性文件中定义)则失败

到目前为止听起来很不错。

但是

@Value("#{${my.prefix.mymap : { a : 1, b : 2 } } }") Map<String, Integer> mymap

@Value("#{${my.prefix.mymap ?: { a : 1, b : 2 } } }") Map<String, Integer> mymap

将 1 和 2 作为值,无论属性文件中定义什么。

我想知道我是否错过了一个神奇的语法,或者我希望太多。
这是一个错误(来自我或框架)还是只是令人沮丧地缺乏功能?

Spring 是 6.0.11

[编辑1]

收到第一条评论后尝试过:

@Value("#{${my.prefix.mymap} ?: { a : 1, b : 2 } }") Map<String, Integer> mymap
但是得到了
Could not resolve placeholder

也尝试过,然后:

@Value("#{${my.prefix.mymap:null} ?: { a : 1, b : 2 } }")
但是在属性文件中定义时遇到了同样的问题:我得到了默认值。

[编辑2]

尝试过

@Value("${my.prefix.mymap : #{ {a:1, b:2} } }")

并得到:
No converter found capable of converting from type [java.util.Collections$UnmodifiableMap<?, ?>] to type [java.lang.String]

my.prefix.mymap={a:2,b:3}
位于属性文件中时

java spring spring-el
1个回答
0
投票

您的

@Value
定义中有错误语法。您在
}
值字符串末尾添加了超出所需的
@Value
。这应该可以解决您的问题:

@Value("#{${my.prefix.mymap}?: {a:1,b:2} }")
Map<String, Integer> mymap;

已更新

如果属性文件中不存在

my.prefix.mymap
,您可以通过以下方式使用此
mymap
类型来设置
Optional
字段:

@Value("${my.prefix.mymap:#{{a:1,b:2}}}")
private Optional<Map<String, Integer>> mymap;

这个的用途:

if (mymap.isPresent()) {
//  log.info(mymap.get().toString());
}

这在

application.properties
文件中:

my.prefix.mymap=#{{a:2,b:3}}
© www.soinside.com 2019 - 2024. All rights reserved.