如何在Spring Boot中将属性文件值读入字符串集合

4
我尝试过使用。
@Value("#{'${white.listed.hotel.ids}'.split(',')}")
private Set<String> fareAlertwhiteListedHotelIds;

但是当 white.listed.hotel.ids 为空时,也要将其设置为空白值。

white.listed.hotel.ids =

请有人帮忙提供一个版本,在该版本中,whiteListedHotelIds 可以包含在属性文件中指定的值,或者在空白情况下没有项目。


你的意思是,如果白名单酒店ID为空,指定一个默认值吗? - AchillesVan
可能是https://dev59.com/2Gct5IYBdhLWcg3wkuPE的重复问题。 - Saravana
@Georgesvanhoutte van houtte:我只是希望在whiteListedHotelIds为空的情况下,将集合设置为空。 - ankita gupta
3个回答

5

您可以调用自定义方法(如此其他答案中描述的那样来构建一个Map,它受到@FedericoPeraltaSchaffner答案的启发):

@Value("#{PropertySplitter.toSet('${white.listed.hotel.ids}')}")
private Set<String> fareAlertwhiteListedHotelIds;

...

@Component("PropertySplitter")
public class PropertySplitter {
    public Set<String> toSet(String property) {
        Set<String> set = new HashSet<String>();

        //not sure if you should trim() or not, you decide.
        if(!property.trim().isEmpty()){
            Collections.addAll(set, property.split(","));
        }

        return set;
    }
}

在这种方法中,您可以自由处理属性(例如在为空时采用特定的逻辑)。

或者跳过中间的 List 步骤,直接使用 Collections.addAll(set, property.split(",")); - Holger
谢谢@Holger!我已经用你的建议替换了Arrays.asList(...)! - alexbt

1
您可以使用Spring表达式语言进行验证,如果提供的字符串为空,则返回空数组或将输入字符串拆分为数组。从jdk-11开始,您可以直接使用isBlank
@Value("#{'${white.listed.hotel.ids}'.trim().isEmpty() ? new String[] {} : '${white.listed.hotel.ids}'.split(',')}")
private Set<String> fareAlertwhiteListedHotelIds;

0

通过构造函数注入@Value(正如您应该做的那样),并在那里进行所有必要的后处理:

@Component
class Foo {
    private final List<String> bar;

    public Foo(@Value("${foo.bar}") List<String> bar) {
        this.bar = bar.stream()
                      .filter(s -> !"".equals(s))
                      .collect(Collectors.toList());
    }
}

没有必要用SPEL使事情变得复杂。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接