将应用程序属性覆盖为undefined / unset

时间:2016-09-26 12:07:19

标签: java spring-boot

我不确定这是否是一个有效的问题,但我想知道这是否可行。

Spring引导项目有一个application.properties和几个特定于配置文件的属性。特定于配置文件的属性会覆盖已定义的application.properties以及application-profile.properties中已定义的任何属性,并且还会添加属于特定于配置文件的属性的属性。下图:

application.properties

key1=value1
key2=value2

application-profile.properties

key1=valueProfile1
key3=valueProfile3

当应用程序以此配置文件启动时,它看到的最终属性如下:

key1=valueProfile1
key2=value2
key3=valueProfile3

简而言之,您拥有公共属性和配置文件属性的并集,其中配置文件属性值附加并覆盖公共属性。

但是如果,在上帝知道什么情况下,我需要在常见的application.properties中定义属性,但我需要它是" undefined"当应用程序在一个特定的配置文件中启动下图:

application.properties

keySpecial=specialValue
key1=value1
key2=value2

application-special.properties

key1=valueSpecial1
//unset or undefine keySpecial
keyAlternateSpecial=specialAlternateValue
key3=valueSpecial3

现在,当应用程序以这个"特殊"开始时profile,我希望它能看到最终的属性如下:

keyAlternateSpecial=specialAlternateValue
key1=valueSpecial1
key2=value2
key3=valueSpecial3

请注意,当应用程序在此特殊配置文件中运行时,keySpecial未定义,甚至不存在。

这可能吗?

注意:我知道我可以避免定义" keySpecial"在常见的application.properties中,并在所有其他配置文件特定属性中定义它们。并指定" keyAlternateSpecial"只在"特别"个人资料。

更多信息:

令我对此感到疑惑的场景是spring boot datasource jndi属性。 From the docs

spring.datasource.jndi-name= # JNDI location of the datasource. Class, url, username & password are ignored when set.

仅仅存在此属性会使应用程序忽略其他数据源属性(类,URL,用户名,密码),即使它们已设置。

我不允许从" application.properties"中删除jndi属性。但相反,我想取消/取消定义它,并在"特殊"中添加其他数据源属性(类,url,用户名,密码)。个人资料。

2 个答案:

答案 0 :(得分:3)

您可以通过设置groupby()来伪造从application.property中删除spring.datasource.jndi-name。这种方式spring.datasource.jndi-name=false不会启用自动配置类。有关详细信息,请参阅ConditionalOnProperty javadoc。

答案 1 :(得分:1)

我通过在默认配置文件中定义JNDI属性来解决我的用例,当没有定义其他配置文件时激活它,这样在开发期间我可以使用不带JNDI的不同数据源。

以下是我的application.yml文件的摘录,不知道这是否适合您。

spring:
  jpa:
    database: POSTGRESQL
    hibernate:
      ddl-auto: none
# Default profile, active by default on JBoss since no spring profiles are activated
---
spring:
  profiles: default
  datasource:
    jndi-name: java:jboss/datasources/anagraficaDS
# Development configuration
---
spring:
  profiles: development
  datasource:
    platform: postgres
    url: jdbc:postgresql://localhost:5432/my-db
    username: root
    password: secret
    driverClassName: org.postgresql.Driver