在我的WebApplication中,我必须检查请求机体的许多传入查询参数。为了不在每种方法中编写相同的代码,我想编写一个返回布尔值的函数。当收到所有必需的参数并且输入集的值不为null时,方法应返回true(否则为false(,我可以在程序中使用传入查询参数。
。因此,我将所有传入参数包装到哈希图中。此外,我将特定列表放入该方法中,该列表提供了所需的参数(密钥(以进行检查。
Queryparams的示例图:
Map queryParams = new HashMap();
queryParams.put("id", "1");
queryParams.put("name", "Jane");
queryParams.put("lastname", "Doe");
示例数组:
String[] keys = {"id", "name", "lastname"};
方法的最后版本:
public static Boolean checkRequestParams(Request request, String[] keys) {
Map params = (JsonUtil.fromJson(request.body(), HashMap.class));
Iterator it = params.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry) it.next();
for (int i = 0; i < keys.length; i++) {
if (pair.getKey().equals(keys[i])) {
return true;
}
}
数组提供的键是客户端发送的Queryparams。不,我想比较它们,并检查hashmap中的键是否等于数组中的给定键,以及地图中键的值是否不为null。
我尝试了许多变体。我有NullPoInterExceptions,或者我总是得到零返回。
我可能错了,但是正如我所知,您想验证以下条件:
- Hashmap键必须属于以下关键字
{"id", "name", "lastname"}
的列表。 - Hashmap中没有值等于null。
您可能会使用类似的东西:
map.entrySet()
.stream()
.allMatch(entry -> keys.contains(entry.getKey()) && entry.getValue() != null)
因此,我们在输入集上迭代,并检查输入密钥是否属于定义的集合以及值不是null。这是一个更详细的示例:
Set<String> keys = Set.of("id", "name", "lastname");
Map<String,List<Integer>> map = Map.of("id", List.of(1,2,3), "name", List.of(4,5,6));
map.entrySet()
.stream()
.allMatch(entry -> keys.contains(entry.getKey()) && entry.getValue() != null);
Map<String,List<Integer>> map1 = Map.of("id", List.of(1,2,3), "not in the keys", List.of(4,5,6));
map1.entrySet()
.stream()
.allMatch(entry -> keys.contains(entry.getKey()) && entry.getValue() != null);
请注意,我正在使用收集工厂方法来创建Map
,List
和Set
,该方法已添加到Java-9中,但是自Java-8以来,Stream API可用。
至于您的代码,您将始终获得true
,因为一旦有一个满足条件的输入集,该方法将返回结果。
for (int i = 0; i < keys.length; i++) {
if (pair.getKey().equals(keys[i])) {
return true; // one single match found return true.
}
}
您可以尝试扭转条件并在不匹配后立即返回False。
for (int i = 0; i < keys.length; i++) {
if (!pair.getKey().equals(keys[i]) || pair.getValue() == null) {
return false; // mismatch found, doesn't need to verify
// remaining pairs.
}
}
return true; // all pairs satisfy the condition.
希望您发现这有用。
仅使用香草爪哇
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ValidatorExample {
public boolean checkRequestParams(Map<String, Object> request, List<String> keys) {
return isEqualCollection(request.keySet(), keys)
&& !containsAnyNull(request.values());
}
private boolean isEqualCollection (Collection<?> a,Collection<?> b){
return a.size() == b.size()
&& a.containsAll(b)
&& b.containsAll(a);
}
private boolean containsAnyNull(Collection<?> collection){
return collection.contains(null);
}
public static void main(String[] args) {
ValidatorExample validatorExample = new ValidatorExample();
List<String> keys = Arrays.asList("id", "name", "lastname");
Map<String, Object> parametersOk = new HashMap<>();
parametersOk.put("id", "idValue");
parametersOk.put("name", "nameValue");
parametersOk.put("lastname", "lastnameValue");
// True expected
System.out.println(validatorExample.checkRequestParams(parametersOk, keys));
Map<String, Object> parametersWithInvalidKey = new HashMap<>();
parametersWithInvalidKey.put("id", "id");
parametersWithInvalidKey.put("name", "nameValue");
parametersWithInvalidKey.put("lastname", "lastnameValue");
parametersWithInvalidKey.put("invalidKey", "invalidKey");
// False expected
System.out.println(validatorExample.checkRequestParams(parametersWithInvalidKey, keys));
Map<String, Object> parametersWithNullValue = new HashMap<>();
parametersWithNullValue.put("id", null);
parametersWithNullValue.put("name", "nameValue");
parametersWithNullValue.put("lastname", "lastnameValue");
// False expected
System.out.println(validatorExample.checkRequestParams(parametersWithNullValue, keys));
}
}
,但我建议您使用验证框架,如果您的项目允许进行更准确的验证。
如果找到匹配项,则不应立即返回,因为我们想测试'所有必需的'参数。尝试以下操作:
String[] keys = {"id, "name", "lastname"};
public static Boolean checkRequestParams(Request request, String[] keys) {
Map params = (JsonUtil.fromJson(request.body(), HashMap.class));
for (int i = 0; i < keys.length; i++) {
Iterator it = params.entrySet().iterator();
boolean found = false;
while (it.hasNext()) {
Map.Entry pair = (Map.Entry) it.next();
if (pair.getKey().equals(keys[i])) {
found = true;
break;
}
}
if (!found) {
return false;
}
}
return true;
}
您将在第一个匹配键上返回true
,而您要检查是否存在 all 键。此外,您的代码不完整,因此,不可能提供完整的诊断。
但是,无论如何,在这里迭代没有任何意义。只需使用
public static Boolean checkRequestParams(Request request, String[] keys) {
Map<?,?> params = JsonUtil.fromJson(request.body(), HashMap.class);
for(String key: keys) {
if(params.get(key) == null) return false;
}
return true;
}
这将确保每个键都存在而不会映射到null
(因为"不映射到null
"已经意味着存在(。
当不考虑将明确映射到null
的可能性时,您可以检查所有键的存在,就像
public static Boolean checkRequestParams(Request request, String[] keys) {
Map<?,?> params = JsonUtil.fromJson(request.body(), HashMap.class);
return params.keySet().containsAll(Arrays.asList(keys));
}
另外,如果任何映射值为null
,您也可以考虑MAP无效,即使其密钥不是强制性键之一。然后,这将像
public static Boolean checkRequestParams(Request request, String[] keys) {
Map<?,?> params = JsonUtil.fromJson(request.body(), HashMap.class);
return params.keySet().containsAll(Arrays.asList(keys))
&& !params.values().contains(null);
}