首页 > 解决方案 > @ConditionalOnExpression 如果属性存在

问题描述

我有 application.yml 有一个属性,它需要一个像这样的数组/列表

tokens:
  token: 
    -  name: one
       site: chicago
  token:
    - name: two
      site: 'st. louis'

我如何使用@ConditionalOnExpression这样的方式,仅在 application.yml 中存在令牌就足够了?

我试过@ConditionalOnProperty("tokens")@CondtionalOnProperty(prefix="tokens", value= {"token"}. 这没用。甚至官方文档也建议使用列表/数组它不会很好。

标签: javaspringspring-boot

解决方案


您可以使用@Conditional(YourCondition.class)

引用文档

为了注册组件而必须匹配的单个条件。在 bean 定义即将注册之前立即检查条件,并且可以根据当时可以确定的任何标准自由否决注册。

插图:

@Conditional(MyCondition.class)
@Controller
public class Box{
   ...
}


public class MyCondition implements Condition{

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment env = context.getEnvironment();
        return null == env.getProperty("tokens.token[0].name");
    }
}

在这里,en.getProperty如果缺少属性,将返回 null。


推荐阅读