@conditionalonexpression与#{systemenvironment}

cyvaqqii  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(381)

我正试图建立一个 @ConditionalExpression 使用以下环境变量:

@ConditionalOnExpression("#{systemEnvironment['PUBLIC']?:'false'} != true")

我可以在以下代码中看到这一点:

private Boolean evaluateExpression(ConfigurableListableBeanFactory beanFactory, String expression) {
        BeanExpressionResolver resolver = beanFactory.getBeanExpressionResolver();
        if (resolver == null) {
            resolver = new StandardBeanExpressionResolver();
        }
        BeanExpressionContext expressionContext = new BeanExpressionContext(beanFactory, null);
        Object result = resolver.evaluate(expression, expressionContext);
        return (result != null && (boolean) result);
    }

问题是 resolver.evaluate(expression, expressionContext); 退货 false != true 这应该是一个 boolean :

return (result != null && (boolean) result);

所以这总是失败的 ClassCastException .
我也试着用不同的方式引用和 Package 它 ${…} ,但结果总是一样的。
问题是:我的条件表达式有什么问题?

yfwxisqw

yfwxisqw1#

一种解决方案是这样的表达:

@ConditionalOnExpression("#{!(systemEnvironment['PUBLIC']?:'false').equals('true')}")

需要补充的是,如果这个问题不是出于调查目的,而是为了找到改进真实(类似产品)代码的方法,我真的建议您:
总是尽量简化这种表达式,因为当你看到大量的布尔比较、默认值等时,很难理解真正发生的事情;
更多使用spring boot特定的东西:
使用布尔表达式时,通常可以替换 @ConditionalOnExpression@ConditionalOnProperty (可选) matchIfMissing 参数);
当您需要读取环境变量时,您可以使用宽松绑定特性,而不是使用(主要是)前spring引导时代的东西,比如 systemProperties / systemEnvironment .

相关问题