2009-12-02 17 views
28

esiste un modo per fare riferimento a un file .properties in spring-context.xml e in persistenza.xml JPA?caricamento .properties in spring-context.xml e persistence.xml

Penso di aver visto da qualche parte un esempio di questo in file di contesto di primavera, anche se non riesco a ricordare dove fosse. Forse qualcuno lo sa? Informazioni su persistence.xml In realtà non sono sicuro che funzioni correttamente.

Il mio obiettivo è modificare alcune proprietà tra la configurazione di sviluppo e quella di distribuzione. L'idea che ho attualmente è di sostituire tutte le proprietà manualmente nei file tramite form da una configurazione di modello. Anche se ci dovrebbe essere un modo migliore per farlo. :)

risposta

16

È possibile fare riferimento a file di proprietà esterne da un file di definizione del bean Spring utilizzando uno PropertyPlaceholderConfigurer. Non penso che funzioni per un persistence.xml JPA, sebbene il supporto JPA di Spring ti permetta di incorporare la maggior parte, se non tutte, il contenuto di persistence.xml nel file bean stesso, nel qual caso funzionerebbe correttamente.

+1

Grazie, per la mia soluzione Ora ho usato il PropertyPlaceholderConfigurer nel context.xml con un jdbc.properties per l'origine dati. Ho spostato la sospensione di entrambi i file in un hibernate.properties. Questi due file vengono sostituiti con versioni diverse per la distribuzione e lo sviluppo. Hibernate.properties sembra essere rilevato correttamente in fase di esecuzione, sebbene all'attività ant hibernatetool debba essere indicato dove si trova il file, anche se si trova nel classpath. Quindi tutto funziona ora. :) – subes

38

Piuttosto che usare la build per creare una versione prod o dev del persence.xml, è sufficiente spostare tutte le impostazioni delle proprietà nel contenuto della molla.

mio persistence.xml è

<?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> 

Nel mio tenore di primavera, Ho quindi utilizzare il PropertyPlaceholderConfigurer per leggere i valori delle proprietà dev/prod e impostare questi in fagiolo EntityManagerFactory

<?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 Era esattamente quello che stavo cercando. Grazie! – andyb

+2

Gli utenti potrebbero voler fare una piccola ricerca prima di utilizzare questo esempio così com'è. Da DriverManagerDataSource JavaDoc: "NOTA: questa classe non è un vero e proprio pool di connessioni, in realtà non raggruppa Connections, ma sostituisce semplicemente un pool di connessioni completo, implementando la stessa interfaccia standard, ma creando nuove connessioni su ogni chiamata." – spaaarky21

Problemi correlati