2009-12-02 14 views
28

¿hay alguna manera de hacer referencia a un archivo .properties en spring-context.xml y en persistencia.xml de JPA?cargando .properties en spring-context.xml y persistence.xml

Creo que he visto en alguna parte un ejemplo de esto en los archivos de contexto de primavera, aunque no recuerdo dónde estaba. Tal vez alguien sabe esto? Acerca de persistence.xml En realidad, no estoy seguro de si esto funciona o no.

Mi objetivo es cambiar algunas propiedades entre el desarrollo y la configuración de distribución. La idea que tengo actualmente es reemplazar todas las propiedades de forma manual en los archivos vía ant desde una configuración de plantilla. Aunque debería haber una mejor manera de hacer esto. :)

Respuesta

16

Puede hacer referencia a los archivos de propiedades externas desde un archivo de definición de Spring Bean usando un PropertyPlaceholderConfigurer. No creo que funcione para un JPA persistence.xml, aunque el soporte de JPA de Spring te permite incorporar la mayoría, si no todo, el contenido de persistence.xml en el archivo beans, en cuyo caso funcionaría bien.

+1

Gracias, por mi solución Ahora uso el PropertyPlaceholderConfigurer en el contexto.xml con un jdbc.properties para el origen de datos. Moví las cosas de hibernación de ambos archivos a hibernate.properties. Esos dos archivos se reemplazan con diferentes versiones para distribución y desarrollo. El hibernate.properties parece detectarse correctamente en el tiempo de ejecución, aunque la tarea hibernatetool debe indicarse dónde está el archivo, incluso si está en el classpath. Así que todo está funcionando ahora. :) – subes

38

En lugar de utilizar su compilación para crear una versión prod o dev de su persistence.xml, simplemente mueva todas las configuraciones de propiedad a su contenido de resorte.

Mi persistence.xml es

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

En mi contenido de primavera, i luego usar el PropertyPlaceholderConfigurer para leer los valores de propiedad dev/prod y establecer estos en el frijol 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 exactamente lo que estaba buscando. ¡Gracias! – andyb

+2

Es posible que los usuarios deseen investigar un poco antes de usar este ejemplo tal como está. Desde DriverManagerDataSource JavaDoc: "NOTA: Esta clase no es un grupo de conexiones real, en realidad no agrupa Conexiones, simplemente sirve como reemplazo simple para un conjunto de conexiones completo, implementa la misma interfaz estándar, pero crea nuevas Conexiones en cada llamada." – spaaarky21

Cuestiones relacionadas