2009-12-02 7 views
28

Gibt es eine Möglichkeit, eine .properties-Datei in einer spring-context.xml und einer JPA-Datei persistence.xml zu referenzieren?Laden von .properties in spring-context.xml und persistence.xml

Ich denke, ich habe irgendwo ein Beispiel dafür in Spring-Kontext-Dateien gesehen, obwohl ich mich nicht erinnern kann, wo das war. Vielleicht weiß das jemand? Über die persistence.xml bin ich mir eigentlich nicht sicher, ob das überhaupt funktioniert.

Mein Ziel ist es, einige Eigenschaften zwischen Entwicklung und Verteilung zu ändern. Die Idee, die ich derzeit habe, ist es, alle Eigenschaften manuell in den Dateien über Ant aus einer Vorlage Config zu ersetzen. Obwohl es einen besseren Weg geben sollte, dies zu tun. :)

Antwort

16

Sie können externe Eigenschaftendateien aus einer Spring-Bean-Definitionsdatei mithilfe einer PropertyPlaceholderConfigurer verweisen. Ich glaube nicht, dass dies für eine JPA-Datei persistence.xml funktionieren wird, obwohl die JPA-Unterstützung von Spring es Ihnen ermöglicht, den Inhalt der Datei persistence.xml in die Beans-Datei selbst zu integrieren. In diesem Fall würde es gut funktionieren.

+1

Danke, für Meine Lösung Ich habe jetzt den PropertyPlaceholderConfigurer in der context.xml mit einer jdbc.properties für die Datenquelle verwendet. Ich habe die Hibernate-Dateien aus beiden Dateien in eine hibernate.properties verschoben. Diese beiden Dateien werden durch verschiedene Versionen für die Distribution und Entwicklung ersetzt. Die hibernate.properties scheint zur Laufzeit korrekt erkannt zu werden, obwohl der hibernatetool ant-Task angegeben werden muss, wo sich die Datei befindet, selbst wenn sie sich im Klassenpfad befindet. So funktioniert jetzt alles. :) – subes

38

Anstatt Ihren Build zu verwenden, um eine Prod- oder Entwicklungsversion Ihrer persistence.xml zu erstellen, verschieben Sie einfach alle Eigenschaftseinstellungen auf Ihren Quellinhalt.

Mein persistence.xml ist

<?xml version="1.0" encoding="UTF-8"?> 
<persistence 
    xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
    version="1.0"> 
    <persistence-unit name="JPAService" transaction-type="RESOURCE_LOCAL"> 
    </persistence-unit> 
</persistence> 

In meinem Frühjahr Inhalt, ich dann die PropertyPlaceholderConfigurer verwenden dev/prod Eigenschaftswerte zu lesen und setzen diese in die EntityManagerFactory bean

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation=" 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 

    <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/> 
    <bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>  
    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> 
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 

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

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="${datasource.driverClassName}"/> 
     <property name="url" value="${datasource.url}"/> 
     <property name="username" value="${datasource.username}"/> 
     <property name="password" value="${datasource.password}"/> 
    </bean> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceXmlLocation" value="classpath:./META-INF/persistence.xml"/> 
     <property name="persistenceUnitName" value="JPAService"/> 
     <property name="dataSource" ref="dataSource"/> 

     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <property name="databasePlatform" value="org.hibernate.dialect.OracleDialect"/> 
       <property name="showSql" value="true" /> 
       <property name="generateDdl" value="true"/> 
      </bean> 
     </property> 
     <property name="jpaProperties"> 
       <!-- set extra properties here, e.g. for Hibernate: --> 
      <props> 
      <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
     <property name="dataSource" ref="dataSource"/> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="false"/> 
</beans> 
+2

+1 War genau das, was ich gesucht habe. Vielen Dank! – andyb

+2

Benutzer möchten möglicherweise ein wenig recherchieren, bevor Sie dieses Beispiel unverändert verwenden. Von der DriverManagerDataSource JavaDoc: "Hinweis: Diese Klasse ist kein tatsächlicher Verbindungspool; sie bündelt keine Verbindungen. Sie dient lediglich als einfacher Ersatz für einen vollständigen Verbindungspool, der die gleiche Standardschnittstelle implementiert, aber für alle neue Verbindungen erstellt Anruf." – spaaarky21

Verwandte Themen