通过给定的键

时间:2017-03-20 11:01:39

标签: java spring

我有一个代码,它使用带有字符串键的属性映射来表示某种上下文。如果地图不包含某些必需的属性,我希望此代码失败。

相应的代码可能如下所示:

SomeResultType businessMethod(Map<String, String> context) {
    Assert.isTrue(context.containsKey("A"), "A property must not be empty");
    Assert.isTrue(context.containsKey("B"), "B property must not be empty");
    Assert.isTrue(context.containsKey("C"), "C property must not be empty");
    // ...
}

我自己用这样的签名写了一个简单的替代品

public static <K, V> void mapContainsKeys(Map<K, V> map, K... keys)

但我认为这样的事情必须已经在某处实施。所以我正在搜索此代码的库替换

如果Spring的人在org.springframework.util.Assert中实现了类似的东西,那就太棒了。

2 个答案:

答案 0 :(得分:2)

如果您只想检查地图是否包含密钥列表,请使用:

map.keySet().containsAll(keys)

如果您想了解更多详细信息,请了解哪些内容缺失:

Set<String> missingKeys = new HashSet<>(keys);
missingKeys.removeAll(map.keySet());

然后:

if (!missingKeys.isEmpty()) {
    throw new IllegalArgumentException(missingKeys + " keys missing");
}

答案 1 :(得分:1)

您必须编写辅助方法这一事实意味着您可能在整个代码中操作映射。 看起来像代码味道,我应该将您的属性映射到一个可以验证一次并传递到任何地方的对象。

由于您使用的是Spring,并且如果您使用的是Spring Boot(现在大多数人都这样做),您可以使用@ConfigurationProperties将配置属性映射到对象。
这样,您还可以添加@javax.validation.constraints.NotNull MathContext,并确保您的媒体资源有效。