当前位置: 首页 > 面试题库 >

.properties文件中的PropertyPlaceholderConfigurer和环境变量

麻和雅
2023-03-14
问题内容

我有一个带有PropertyPlaceholderConfigurer的Spring application-
context.xml,可以从.properties文件中获取属性的值。主和测试源文件夹具有单独的.properties文件。问题是我需要在.properties文件中使用环境变量。但是当我通过以下方式进行操作时:

property.name=${env.SYSTEM_PROPERTY}

我收到以下错误:

org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'beanName' defined in class path resource [com/example/applicationContext.xml]: Could not resolve placeholder 'env.SYSTEM_PROPERTY'

而占位符配置器定义

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:com/example/application.properties"/>
</bean>

关于如何使property.name解释为环境变量(而不是占位符)的任何想法?

最好的问候,德米特里。


问题答案:

我可能会完全更改解决方案:直接注入系统属性,而不是注入引用系统属性的属性

例如

@Value("#{ systemProperties['JAVA_MY_ENV'] }") 
private String myVar;

要么

<property name ="myVar" value="#{systemProperties['JAVA_MY_ENV']}"/>

我使用这样的属性占位符配置器

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations">
    <list>
        <value>classpath:someprops.properties</value>
    </list>
  </property>
  <property name="ignoreResourceNotFound" value="true" />
  <property name="searchSystemEnvironment" value="true" />
  <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />

您还必须记住使用以下命令将参数传递给程序

 -DJAVA_MY_ENV=xyz

这样,当您运行生产版本时,您可以通过一件事,而在运行测试时,您可以通过另一件事。

同样,我经常做的事情是这样的:

  <property name="locations">
    <list>
      <value>classpath:someprops.properties</value>
      <value>classpath:someprops-{environment}.properties</value>
    </list>
  </property>

环境是prod / stage / test / int / ci /
local(每个环境1个-您现在可能只有2个或3个)。您可以将环境变量传递给程序。无论其在本地PC
/测试上的生产/运行情况如何,任何应相同的属性都应位于someprops.properties属性文件中。特定于环境/运行方式的任何内容都将放在更特定的文件中(除非覆盖机制,否则应将其放置在someprops.properties文件以及默认文件中)

例如在classpath:someprops.properties中

url=www.mysite.com

在classpath:someprops-local.properties中

url=localhost

通过使用此基本思想,您可以以干净的方式将测试和程序的正常运行属性分开。



 类似资料:
  • Application.Properties 误差 我已经在。bash_profile中设置了环境变量。然后。 我也重新启动了eclipse,只是为了覆盖所有的基础。

  • 如何配置 比如要 # OS X, Linux $ PORT=3000 umi dev # Windows (cmd.exe) $ set PORT=3000&&umi dev # Or use cross-env for all platforms $ yarn add cross-env --dev $ cross-env PORT=3000 umi dev # .env $ echo P

  • 问题内容: 我正在尝试编写一个函数来执行Java中环境变量的替换。因此,如果我有一个看起来像这样的字符串: 用户$ {USERNAME}的APPDATA路径为$ {APPDATA}。 我希望结果是: 用户msmith的APPDATA路径为C:\ Users \ msmith \ AppData \ Roaming。 到目前为止,我坏了的实现看起来像这样: 使用上面的示例文本,返回false。但是,

  • 问题内容: 我在 根文件夹 文件中有.env 文件 并将文件放在文件夹中。文件的第一行是 我还尝试了以下操作: ; ; 但是,当我从 命令提示符* 运行文件时,不会加载我的env变量 * 如果我使用 Visual Studio 并按 F5 ,它将加载! 我不确定我在做什么错,我想念什么。任何建议都非常感谢。谢谢。 问题答案: 使用如何? 您的问题似乎是执行路径。

  • 问题内容: 我正在尝试从批处理文件中读取变量,以供以后在批处理脚本(这是Java启动器)中使用。理想情况下,我希望所有平台(Unix,Windows)上的设置文件具有相同的格式,并且也是一个有效的Java属性文件。也就是说,它应如下所示: 是否可以像在Unix shell脚本中一样读取这些值?罐子应该看起来像这样: 我知道可以使用来实现,但是我真的希望所有平台上的设置都使用相同的文件格式。 需要说

  • 问题内容: Jenkins(管理jenkins->系统信息)下的环境变量从何而来? 我检查了/etc/init.d/tomcat5,/ usr / bin / dtomcat5,/ usr / bin / tomcat5,/ etc / sysconfig / tomcat5和/ etc / profile,但在那里没有看到任何此类变量,特别是与Oracle相关的变量(Base,Home,Ld_l