Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @使用#{systemEnvironment}的条件表达式_Java_Spring_Spring Boot - Fatal编程技术网

Java @使用#{systemEnvironment}的条件表达式

Java @使用#{systemEnvironment}的条件表达式,java,spring,spring-boot,Java,Spring,Spring Boot,我正在尝试使用以下环境变量设置一个@ConditionalExpression: @ConditionalOnExpression("#{systemEnvironment['PUBLIC']?:'false'} != true") 我可以看到这在以下代码中进行了评估: private Boolean evaluateExpression(ConfigurableListableBeanFactory beanFactory,字符串表达式){ BeanExpressionR

我正在尝试使用以下环境变量设置一个
@ConditionalExpression

@ConditionalOnExpression("#{systemEnvironment['PUBLIC']?:'false'} != true")
我可以看到这在以下代码中进行了评估:

private Boolean evaluateExpression(ConfigurableListableBeanFactory beanFactory,字符串表达式){
BeanExpressionResolver解析器=beanFactory.getBeanExpressionResolver();
if(解析器==null){
resolver=新标准BeanPressionResolver();
}
BeanExpressionContext表达式上下文=新的BeanExpressionContext(beanFactory,null);
Object result=resolver.evaluate(表达式,表达式上下文);
返回(结果!=null&(布尔)结果);
}
问题是,
resolver.evaluate(expression,expressionContext)返回
false!=true
其中该值应为布尔值

返回(结果!=null&&(布尔)结果);
因此,对于
ClassCastException
,这总是失败的

我还尝试着用不同的引用方式,并用
${…}
将其包装成一个整体,但结果总是一样的


问题是:我的条件表达式有什么问题?

一个解决方案可能是这个表达式:

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

需要补充的是,如果这个问题不是出于调查目的,而是为了找到改进真实(类似于生产)代码的方法,我真的建议您:

  • 总是试图简化这种表达式,因为当你看到很多布尔比较、默认值等时,很难理解真正发生了什么
  • 更多使用spring boot特定功能:
  • 使用布尔表达式时,通常可以将
    @ConditionalOnExpression
    替换为
    @ConditionalOnProperty
    (可选使用
    matchIfMissing
    参数)
  • 当您需要读取环境变量时,可以使用feature,而不是使用(大部分)前Spring引导时代的东西,如
    systemProperties
    /
    systemEnvironment