如何在使用 ObjectMapper 映射响应时忽略/捕获 IllegalArgumentException "No enum constant"?



假设我有一个枚举:

public enum SomeType {
TYPE1, TYPE2, TYPE3
}

我将API响应映射到返回SomeType的服务,并将附加数据映射到Map<SomeType, SomeTypeDetails>:

private Map<SomeType, SomeTypeDetails> mapSomeTypeResponseJson(String someTypeResponseJSON) {
JSONObject someTypeResponse = new JSONObject(someTypeResponseJSON);
return someTypeResponse.toMap().entrySet()
.stream()
.collect(Collectors.toMap(
Map.Entry::getKey, someTypeMap ->
myObjectMapper.getObjectMapper()
.convertValue(someTypeMap.getValue(), SomeTypeDetails.class))
);
}

但我无法控制响应,其他团队可能会向他们的SomeType枚举添加一些新值,例如TYPE4TYPE5,而我还没有很快得到有关添加的信息。

是否有可能使上面的mapSomeTypeResponseJson方法(我处理响应的entrySet()的部分(忽略未知的SomeType值,或者——甚至更好——以这样的方式进行,即我可以捕获IllegalArgumentExceptionLOGGER.warn(),甚至可以进行一些更复杂的错误处理?

你可以这样做来忽略你没有配置的类型:

private Map<SomeType, SomeTypeDetails> mapSomeTypeResponseJson(String someTypeResponseJSON) {
JSONObject someTypeResponse = new JSONObject(someTypeResponseJSON);
final Set<SomeType> types = Set.of("TYPE1","TYPE2","TYPE3");
return someTypeResponse.toMap().entrySet()
.stream()
.peek(entry -> {
if (!types.contains(entry.getKey())) {
System.out.println(entry.getKey() + " is not registered yet.");
}
})
.filter(es -> types.contains(es.getKey()))
.collect(Collectors.toMap(
Map.Entry::getKey, someTypeMap ->
myObjectMapper.getObjectMapper()
.convertValue(someTypeMap.getValue(), SomeTypeDetails.class))
);
}

最新更新