Spring属性文件将null设置为property

时间:2018-03-23 21:13:07

标签: java spring spring-boot properties-file

目前我的src/main/resources文件夹中有一些属性文件:

- application.properties
- application-dev.properties
- application-test.properties

现在,当我指定一个配置文件时,它会加载该配置文件的特定文件和一般application.properties,并用前者覆盖所有内容。

但是,当我的应用程序在生产中部署时,没有传递任何配置文件,因此application.properties 必须是我的生产文件。

这很好,因为我可以覆盖特定配置文件中的所有内容。然而,有一个问题;在制作方面,我现在需要设置:

spring.datasource.jndi-name=jdbc/appname

当我将其添加到application.properties时,每个配置文件也会继承它,然后,当我运行dev服务器或测试时,它会给我这个错误:

  

引起:javax.naming.NoInitialContextException:需要在环境或系统属性,applet参数或应用程序资源文件中指定类名:java.naming.factory.initial

因为我确实没有在我自己的环境中使用这个JNDI东西;我使用以下属性:

spring.datasource.url=jdbc:url
spring.datasource.username=user
spring.datasource.password=pass

我的问题是:我不能为我的生命覆盖这个属性。如果我在env特定文件中添加任何这些文件,它将被忽略并且错误仍然存​​在:

spring.datasource.jndi-name= # empty string, does nothing
spring.datasource.jndi-name=<null> # read somewhere it meant null, doesn't work
spring.datasource.jndi-name=${inexistentProp} # I though it might return null, but gives an error

那么,我该怎么办?我想到了几个解决方案:

  • 一种在弹簧属性文件中将属性值设置为正确的null或未定义的方法(因为空不起作用)
  • 一种将常用的继承属性文件更改为其他内容的方法(我尝试了@PropertySource,但它只添加了更多选项,最终总是回到application.properties)
  • 通过属性文件完全禁用JNDI,尽管有以前的属性(我按照here尝试spring.jndi.ignore=true,但无济于事)

但要么我不知道他们是怎么做的。

1 个答案:

答案 0 :(得分:3)

Spring Boot文档,24.4 Profile-specific Properties

  

除了application.properties文件之外,还可以使用以下命名约定来定义特定于配置文件的属性:application-{profile}.propertiesEnvironment有一组默认配置文件(默认情况下为[default]),如果未设置活动配置文件,则会使用这些配置文件。换句话说,如果没有显式激活配置文件,则会加载application-default.properties中的属性。

25.1 Adding Active Profiles

  

spring.profiles.include属性可用于无条件添加活动配置文件。

因此,使用以下属性创建application-default.properties文件:

spring.profiles.include=prod

现在将spring.datasource.jndi-name=jdbc/appname属性从application.properties文件移至application-prod.properties文件。

运行具有特定配置文件的代码时,将不会使用prod配置文件,并且spring.datasource.jndi-name将未定义。

在生产中运行代码时,如果未指定配置文件,默认情况下会包含prod配置文件,并且会定义spring.datasource.jndi-name

您当然可以将生产属性放在application-default.properties本身,但上述方法可以更清楚地了解您正在做什么。

如果您最终获得多个配置文件,它也会变得更容易。例如。您有prod vs dev vs test。但是,如果您拥有独立的配置文件集,例如foo vs bar,并且默认生产环境应为prod,foo,该怎么办?允许备用生产环境使用prod,bar,并且每个环境都可以单独测试(test,footest,bar)。

通过使用default配置文件仅包含其他配置文件,无需另外定义任何属性,您现在可以根据需要手动混合和匹配配置文件。