5

春のプロジェクトの開発と運用の設定が必要です。春のプロファイルを使用できることは理解していますが、それは私たちができることではありません.

私がやりたいことは、開発環境に test-application.properties ファイルを配置し、本番環境に prod-application.properties ファイルを配置することです。tomcat コンテキスト定義では、以下を送信しました。

<Context>
    <context-param>
        <param-name>properties_location</param-name>
        <param-value>file:C:\Users\Bill\test-application.properties</param-value>
    </context-param>
</Context>

そして、運用サーバーの値を変更できます。春の設定では、次のようなものがあります。

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>${properties_location}</value>
        </list>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="false" />
</bean>

しかし、次のようなエラーが発生し続けます。

org.springframework.beans.factory.BeanInitializationException: プロパティを読み込めませんでした。ネストされた例外は java.io.FileNotFoundException: ServletContext リソース [/${properties_location}] を開けませんでした

解決方法に関するアイデアはありますか?

4

6 に答える 6

8

PropertyPlaceholderの機能の1つは、複数のリソースの場所を定義できることです。したがって、たとえば、 file:C:/ Users / ${user.name}/test-application.propertiesとともにyour-production-config.propertiesを定義できます。

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:your-production-config.properties</value>
            <value>file:C:/Users/${user.name}/test-application.properties</value>
        </list>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="true"/>
    <property name="ignoreResourceNotFound" value="true"/>
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>        
</bean>

本番環境の場合は、prod構成をクラスパスのどこかに配置する必要があります(正確にはクラスパスだけです)-ローカル環境の場合は、次のファイルのような変換を使用できます:C:/Users/${user.name}/test-application.properties

于 2012-07-31T09:12:07.127 に答える
2

コンテキストパラメータを使用せずに解決することになりました。代わりに、

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:application.properties</value>
            <value>file:C:\Users\Bill\prod-application.properties</value>
        </list>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="true" />
    <property name="ignoreResourceNotFound" value="true"/>
</bean>

この方法では、両方のファイルを読み込もうとします。テストサーバーにはprodファイルがないため、ロードされません。prodサーバーには、prod-application.propertiesファイルが存在し、クラスパスにあるテストをオーバーライドします。面倒ですが動作します!

于 2012-07-31T08:34:28.263 に答える
2
<context:property-placeholder location="file:${catalina.home}/conf/myFirst.properties" ignore-unresolvable="true" />
<context:property-placeholder   location="classpath:second.properties"  ignore-unresolvable="true"  />

私は上記のようにそれをします。このcatalina.home変数を使用すると、プロパティファイルをtomcathomeconfディレクトリにlcoatすることができます。

于 2012-07-31T09:42:46.023 に答える
1

個人的には、場所を指定しないようにしてください。これを実現するには、JNDI を使用するのが最善だと思います。

tomcat/conf/server.xml 内

<Resource name="jdbc/prod" auth="Container"
          type="javax.sql.DataSource" driverClassName="${database.driverClassName}"
          url="${database.url}"
          username="${database.username}" password="${database.password}"
          maxActive="20" maxIdle="10"
          maxWait="-1"/>

および tomcat catalina.properties 内 (Oracle XE を使用している場合は、適宜変更します):

database.driverClassName=oracle.jdbc.driver.OracleDriver
database.url=jdbc:oracle:thin:@//localhost:1521/XE
database.username=user
database.password=password

アプリケーションで、jdbc.properties という名前のクラスパスにプロパティ ファイルを作成し、以下を配置します (Oracle XE を使用している場合は、それに応じて変更します)。

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:user/password@//localhost:1521/XE

その後、Spring では applicationContext.xml

<context:property-placeholder location="classpath:jdbc.properties" />

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/prod" />
    <property name="defaultObject" ref="dataSourceFallback" />
</bean>
<bean id="dataSourceFallback" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="poolPreparedStatements">
        <value>true</value>
    </property>
    <property name="maxActive">
        <value>4</value>
    </property>
    <property name="maxIdle">
        <value>1</value>
    </property>
</bean>
于 2012-07-31T09:30:04.880 に答える
0

使用する :

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>C:/Users/Bill/test-application.properties</value>
        </list>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="false" />
</bean>

から以下のコードを削除しますweb.xml

<Context>
    <context-param>
        <param-name>properties_location</param-name>
        <param-value>file:C:\Users\Bill\test-application.properties</param-value>
    </context-param>
</Context>
于 2012-07-31T07:58:08.370 に答える