簡體   English   中英

如何在Spring Web應用程序項目中將OS環境變量連接到application.properties中的占位符?

[英]How to connect OS environment variables to placeholders in application.properties in a Spring Web app project?

1)我創建了這里提到的環境文件

  • 我創建了一個名為Prod.env的文件,並輸入以下內容

     SPRING_DATASOURCE_URL="jdbc:mysql://5.6.7.8:3306/ab?autoReconnect=true&characterEncoding=utf8" SPRING_DATASOURCE_USERNAME="root" SPRING_DATASOURCE_PASSWORD="IWin" 
  • 然后我執行了以下命令export $(cat Prod.env | xargs)

2)然后我使用以下代碼在WEB-INF下創建了application.properties

spring.datasource.driver-class-name:com.mysql.jdbc.Driver
spring.datasource.url=${SPRING_DATASOURCE_URL}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD}

3)然后在spring-security.xml

  <b:bean id="mappings" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <b:property name="location">
            <b:value>/WEB-INF/application.properties</b:value>
        </b:property>
  </b:bean> 
  <b:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <b:property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
        <b:property name="url" value="${spring.datasource.url}" />
        <b:property name="username" value="${spring.datasource.username}" />
        <b:property name="password" value="${spring.datasource.password}" />
  </b:bean>

現在,當我保存所有內容並重新啟動時,我得到

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'dataSource' defined in ServletContext resource [/WEB-INF/spring/appServlet/spring-security.xml]: Could not resolve placeholder 'SPRING_DATASOURCE_URL' in string value "jdbc:mysql:${SPRING_DATASOURCE_URL}"; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'SPRING_DATASOURCE_URL' in string value "jdbc:mysql:${SPRING_DATASOURCE_URL}"

我要實現的目標是:通過application.properties(或在spring-security.xml中進行一些配置)訪問環境變量,但不使用Java代碼。 我在這里想念什么?

我搜索了幾個問題,但沒有一個清楚地解釋它。 請幫忙

注意:我的不是Spring Boot項目。 這是正常的Spring 4.0.3 Web應用程序。

通常的方法是應用程序不應該了解任何有關環境類型的信息(ENV,INTP,PROD等)。這意味着,不要指定環境(階段)名稱,而是使用相同的屬性文件名稱 (需要放置)文件的版本放入類路徑。 例如,在DEV環境中,將application.properties的DEV版本放到類路徑中;在PROD環境中,將application.properties的PROD版本放到類路徑中。

在您的情況下,我建議您從WEB-INF中刪除application.properties並將其放在WAR之外(如果使用EAR,也要在EAR之外)。 將其放入您的應用程序的類路徑或應用程序服務器的類路徑,並按以下方式配置您的bean:

  <b:bean id="mappings" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <b:property name="location">
            <b:value>classpath*:application.properties</b:value>
        </b:property>
  </b:bean> 

屬性文件中不需要屬性spring.datasource.driver-class-name ,因為您已經直接在XML中定義了它:

<b:property name="driverClassName" value="com.mysql.jdbc.Driver" /> 

您可以在application.properties中定義的其他屬性,如下所示:

spring.datasource.url="jdbc:mysql://5.6.7.8:3306/ab?autoReconnect=true&amp;characterEncoding=utf8"
spring.datasource.username=root
spring.datasource.password=IWin

不要將application.properties放到WAR中,而是放到您的應用服務器的類路徑中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM