【问题标题】:Spring Expression Language - set different value if Profile is setSpring Expression Language - 如果设置了 Profile,则设置不同的值
【发布时间】:2018-10-15 16:04:46
【问题描述】:

我有这样的课:

public AbstractConfig() {
    super(DataConfig.MGR_NAME);
}

DataConfig里面有:

    public final String MGR_NAME = "theManager";

我发现 SpEL 文档令人困惑。如果设置了 Spring Profile,有没有办法可以更改值?也就是说,如果我的配置文件“AlternateManager”使用theManagerAlt,否则默认使用theManager

虽然我编写了这个符号来获得一个活跃的配置文件,但我希望存在一些类似下面的语法来完成这项工作:

    @Value("#PROFILE['AlternateManager'] ? 'theManagerAlt' : 'theManager' ")
    public final String MGR_NAME;

【问题讨论】:

    标签: java spring spring-el spring-profiles


    【解决方案1】:

    回答:

    找了好久,终于找到了。希望这对其他人有用!这有效:

    @Value("#{environment.acceptsProfiles('AlternateManager') ? 'theManagerAlt' : 'theManager' }")
    

    String 不能是final,但我可以接受。

    我觉得这没有很好地记录在案。
    这张旧票:https://jira.spring.io/browse/SPR-9037 将我链接到一个旧的 SO 问题,它给了我答案。

    这张票本质上是要求提供更好的文件。
    IMO,每个人都应该投票给那张 6 岁的 OPEN 票。

    【讨论】:

      【解决方案2】:

      如果设置了 AlternateManager,则使用它,否则使用管理器(默认)

      @Value("#{PROFILE['AlternateManager'] ?: 'theManager' }")
      public final String MGR_NAME; 
      

      【讨论】:

      • 如果不清楚,我想我编造了“PROFILE”的符号——它不在我能找到的任何文档中。无论如何,我尝试了您建议的语法,但在尝试处理“PROFILE”时它会爆炸
      • 请参考baeldung.com/spring-value-defaults。 5.使用SpEL
      • 是的,它告诉如何从任何已设置的系统属性中获取值。我的问题是您能否在 SpEL 表达式中将 Spring 配置文件的设置用作布尔值(即给定配置文件是否“活动”)。我不知道怎么...
      • 根据您的尝试,我建议您查看@ConditionalOnProperty 或@ConditionalOnExpression 或定义自定义条件来设置属性。
      【解决方案3】:

      如果 AbstractConfig 是 Spring bean,您可以编写一个 Configuration 类,在其中使用预期参数初始化 bean,具体取决于您的“AlternateManager”配置文件是否处于活动状态:

      @Configuration
      public class ExampleConfiguration {
      
        // If AlternateManager profile is enabled, Spring Bean will be initialized with "theManagerAlt"
        @Bean
        @Profile("AlternateManager")
        public AbstractConfig getDevDataSource() {
          return new AbstractConfig("theManagerAlt");
        }
      
        // if AlternateManager profile is not enabled, Spring Bean will be initialized with "theManager"
        @Bean
        @Profile("!AlternateManager")
        public AbstractConfig getProdDataSource() {
            return new AbstractConfig("theManager");
        }
      }
      

      【讨论】:

      • 给了你赏金,因为我不想让它浪费——否则它就会过期!您的回答为我指明了一些更好的搜索,我认为这些搜索帮助我最终找到了答案!
      • 很高兴知道我可以帮助你。并感谢您的赏金!
      猜你喜欢
      • 2013-03-26
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      • 2022-01-18
      • 1970-01-01
      相关资源
      最近更新 更多