【问题标题】:How to split value of property in application.properties如何在 application.properties 中拆分属性的值
【发布时间】:2019-12-07 10:48:14
【问题描述】:

我想拆分属性定义的 application.properties 的值并将其用作另一个属性的值。

以下是我在 application.properties 文件中的属性

test.product.release.version=2003.1
test.product.release.year=${test.product.release.version}.split('.')[0]

我希望 test.product.release.year 的财产价值为 2003

我尝试使用${test.product.release.version}.split('.')[0] 进行拆分,但是当我在控制器中获取属性时,我仍然获得2003.1.split('.')[0] 的值

我怎样才能将其仅作为2003 获取?

【问题讨论】:

  • 为什么不把它加载为数组呢?
  • @Deadpool 我不想这样,因为我想再次使用属性 test.product.release.year 作为另一个属性的值。
  • 试试我的答案,我测试了它并工作

标签: spring spring-boot application.properties


【解决方案1】:

你可以直接在控制器中获取年份

@Value("#{'${test.product.release.version}'.split('[.]')[0]}")
private String year;

版本相同

@Value("#{'${test.product.release.version}'.split('[.]')[1]}")
private String version;

同样你也可以在属性文件中指定这个表达式

test.product.release.version=2003.1
test.product.release.year="#{'${test.product.release.version}'.split('[.]')[0]}"
test.product.release.version="#{'${test.product.release.version}'.split('[.]')[1]}"

然后用@Value读取test.product.release.year

@Value("${test.product.release.year}")
private String value;

【讨论】:

  • test.product.release.version="#{'${test.product.release.version}'.split('[.]')[1]}" 仍然给我带来价值,因为"#{'V2003.1'.split('[.]')[0]}" 我正在通过AbstractEnvironment 获取它#getProperty
  • 你为什么不用@Value
  • 因为你在回答中提到同样你也可以在属性文件中指定这个表达式
  • 检查我的更新答案,它适用于ymlproperties 文件@Sameer
  • 我也使用env.getProperty("test.product.release.year"进行了测试,它给了我"#{'2003.1'.split('[.]')[0]}",所以只需使用@Value而不是env
【解决方案2】:

在我看来,你应该换个角度看:

test.product.release.version.year=2003
test.product.release.version.sub=1
test.product.release.version=${test.product.release.version.year}.${test.product.release.version.sub}

【讨论】:

  • 我不能使用两个属性,因为属性 test.product.release.version.year 的值不受我不想触摸的安装程序控制
【解决方案3】:

使用以下表达式。这将起作用。

@Value("#{\"${test.product.release.version}\".split(\"\\.\")}")
private String[] myValues;

// this will give you year part.
@Value("#{\"${test.product.release.version}\".split(\"\\.\")[0]}")
private String year;

【讨论】:

    【解决方案4】:

    由于您将拥有一个属性并从第一个属性中派生出另一个属性,因此最好按以下方式进行:

    application.properties

    test.product.release.version=2003.1
    

    配置类

    @Value("${test.product.release.version}")
    private String version;
    @Value("#{'${test.product.release.version}'.split('\\.')[0]}")
    private String year;
    

    【讨论】:

    • 如果没有配置版本{'${test.product.release.version}'.split('\\.')[0]}会崩溃。
    • @JobinJoseph 定义了test.product.release.version 是作为问题本身的一部分的先决条件。很明显,如果没有定义它并与@Value一起使用,应用程序将根本无法启动。
    • 所以最好用@ConfigurationProperties看这里stackoverflow.com/a/47178928/2893693
    • @JobinJoseph @ConfigurationProperties 只是使用属性的另一种方式,但这不是问题的重点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多