首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免MVEL PropertyAccessExceptions

如何避免MVEL PropertyAccessExceptions
EN

Stack Overflow用户
提问于 2019-07-04 22:37:39
回答 2查看 503关注 0票数 1

当哈希映射中的顶级键可能存在也可能不存在时,如何绕过PropertyAccessExceptions?

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

有什么建议吗?

代码语言:javascript
复制
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的变通方法。

EN

回答 2

Stack Overflow用户

发布于 2020-03-30 11:47:48

我最近也遇到了同样的问题,我发现MVEL有不同的计算表达式的方法,其中一种是布尔型的public static Boolean evalToBoolean(String expression, VariableResolverFactory vars)。当您传递Map of变量时,它会在内部实例化CachingMapVariableResolverFactory,您可以覆盖它以避免此问题。

示例实现如下

代码语言:javascript
复制
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))

我不知道这是不是一个黑客,或者它的意思是这样使用,但它工作

票数 2
EN

Stack Overflow用户

发布于 2021-09-07 13:34:12

只需在MVEL脚本中为您的属性加上"?“前缀,并将其求值为null:

代码语言:javascript
复制
result = MVEL.evalToBoolean("?aValue != null && ?aValue == aNonExistentProperty", variables);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56890178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档