gpt4 book ai didi

java - 如何避免 MVEL PropertyAccessExceptions

转载 作者:行者123 更新时间:2023-12-02 03:30:04 26 4
gpt4 key购买 nike

当 HashMap 中的顶级键可能存在也可能不存在时,如何解决 PropertyAccessExceptions?

在下面的示例中,如果属性存在,它就可以正常工作,但如果变量映射中不存在该属性,则会抛出 PropertyAccessExceptions。我知道我可以使用 ?对于 null 安全导航,但是当该属性存在于顶层时,这不起作用。

有什么建议吗?

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

我想要一种解决方法来避免 PropertyAccessException。

最佳答案

我最近遇到了同样的问题,我发现 MVEL 有不同的方法来评估表达式,其中一个方法是,对于 boolean 值,public static Boolean evalToBoolean(String expression, VariableResolverFactory vars)。当您传递变量的 Map 时,它会在内部实例化 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(表达式, new CustomVariableResolvableFactory(vars))

我不知道这是否是一种黑客攻击,或者它是否意味着像这样使用,但它有效

关于java - 如何避免 MVEL PropertyAccessExceptions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56890178/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com