【问题标题】:SpEL (Spring) syntax for default value when property non-existant or equal to 0当属性不存在或等于 0 时默认值的 SpEL (Spring) 语法
【发布时间】:2019-05-18 03:27:39
【问题描述】:

我正在尝试将 Integer 属性设置为默认值 1,如果它不存在或者其当前值为 0 并且我无法让 0 比较正常工作。

原始值(如果设置)将通过命令行输入。

这是我班上的相关行:

@Configuration
public class AppConfig {

    @Value("${${instance.procmultiplier} == 0 ? Integer.parseInt('1') : ${instance.procmultiplier}}")
    public Integer procMultiplier;
}

我尝试了@Value 注释的多种变体,有一次,我发誓它识别了 0 值,我无法回到那个状态。我首先试图让它识别 0 值并默认为 1,然后我将尝试插入一个空检查。

有没有办法在同一个注解中同时做到这两点?我的一个想法是将 null-check 和 0-check 拆分为两个不同的属性,基本上在属性文件中有procmultiplier=${instance.procmultiplier:1},然后将注释更改为@Value("${${procmultiplier} == 0 ? Integer.parseInt('1') : ${procmultiplier}}"),但我没有尝试任何工作。

我的命令是:mvn clean package && java -Dspring.profiles.active=json -Dinstance.procmultiplier=0 -jar target/MyApp-0.0.1-SNAPSHOT.jar

该属性最终与我在命令行中设置的值相同。

关于如何检查不存在和 0 的任何想法,如果其中任何一个为真,则默认为 1,否则设置为通过命令行输入的任何内容?

【问题讨论】:

    标签: java spring spring-boot spring-el


    【解决方案1】:

    根据this post你应该试试

    @Value("#{someBean.someProperty != null ? someBean.someProperty : 'default'}")
    private String ternary;
    

    【讨论】:

    • 它不是一个bean,它是一个简单的属性。
    • 此外,检查“null”与检查是否存在不同。如果我不使用命令行属性,则会收到无法解析占位符错误。
    • 您也可以添加&& someBean.someProperty != 0 条件。如果你愿意,你可以在 application.properties 中为该值提供一个默认值
    • 它仍然不是 bean。为了解析一个属性(而不是一个 bean 字段),你需要 ${...} 在里面。您的回答不正确,但确实给了我一些急需的灵感!
    • 其实'2的帖子里也写过。运营商部分。但是我的回答有一半是正确的,因为 #{...} 东西 :D 另一半是你的,所以我给你一个赞成票 :)
    【解决方案2】:

    看来我的问题是使用${...} 而不是#{...}。这是我使用两个不同属性的解决方案:

    bootstrap.properties

    procmultiplier=${instance.procmultiplier:1}

    AppConfig.java

    @Configuration
    public class AppConfig {
    
        @Value("#{${procmultiplier} == 0 ? 1 : ${procmultiplier}}")
        public Integer procMultiplier;
    }
    

    命令行: mvn clean package && java -Dspring.profiles.active=json -Dinstance.procmultiplier=0 -jar target/MyApp-0.0.1-SNAPSHOT.jar

    还允许缺少instance.procmultiplier 参数。

    我仍然不知道如何用 1 个属性一次性完成所有操作...

    【讨论】:

      【解决方案3】:

      这在 xml 中适用于我:

      <bean id="myBean" class="myClass" >
          <property name="myProp" value="#{systemProperties['a.b'] ?: '${a.b}'}"/>
      </bean>
      

      如果存在则从系统属性中获取,否则从属性文件中获取

      【讨论】:

        猜你喜欢
        • 2011-06-09
        • 2016-02-29
        • 1970-01-01
        • 2018-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-31
        相关资源
        最近更新 更多