当哈希映射中的顶级键可能存在也可能不存在时,如何绕过PropertyAccessExceptions?
在下面的示例中,如果该属性存在,它将正常工作,但如果该属性不存在于变量映射中,它将抛出一个PropertyAccessExceptions。我知道我可以使用?用于空安全导航,但当该属性存在于顶层时,这不起作用。
有什么建议吗?
HashMap<String, Object> variables = new HashMap<>();
variables.put("aProperty", "aValue");
Boolean result = MVEL.evalToBoolean("'aValue' == aProperty", variables);
assertThat(result).isTrue(); //This works
result = MVEL.evalToBoolean("'aValue' == aNonExistentProperty", variables);
assertThat(result).isFalse(); //This throws a PropertyAccessException, since aNonExistentProperty is not defined我想要一个避免PropertyAccessExceptions的变通方法。
发布于 2020-03-30 11:47:48
我最近也遇到了同样的问题,我发现MVEL有不同的计算表达式的方法,其中一种是布尔型的public static Boolean evalToBoolean(String expression, VariableResolverFactory vars)。当您传递Map of变量时,它会在内部实例化CachingMapVariableResolverFactory,您可以覆盖它以避免此问题。
示例实现如下
public class CustomVariableResolvableFactory extends CachingMapVariableResolverFactory{
public CustomVariableResolvableFactory(Map variables) {
super(variables);
}
@Override
public boolean isResolveable(String name) {
if(!super.isResolveable(name))
variables.put(name, null);
return true;
}
}这个类将确保每当PropertyAccessor检查求值上下文中是否存在变量时,如果不存在,它将放入一个null,并返回true,从而避免PropertyAccessExceptions。这个自定义的VariableResolverFactory实现可以用在下面。
MVEL.eval(expression, new CustomVariableResolvableFactory(vars))
我不知道这是不是一个黑客,或者它的意思是这样使用,但它工作
发布于 2021-09-07 13:34:12
只需在MVEL脚本中为您的属性加上"?“前缀,并将其求值为null:
result = MVEL.evalToBoolean("?aValue != null && ?aValue == aNonExistentProperty", variables);https://stackoverflow.com/questions/56890178
复制相似问题