Hibernate + Spring - mapeo xml no encontrado

Tengo una aplicación simple con la siguiente estructura de carpetas:

  • ProjFolder
  • | ----- src
  • | ---------- nombre del paquete
  • | --------------- {archivos fuente}
  • | ---------- META-INF
  • | --------------- {beans.xml}
  • | --------------- {hibernate.cfg.xml}
  • | --------------- {EntityMapping.hbm.xml}

aquí está la parte del archivo de configuración beans.xml Spring:

<bean id="propertyConfigurer"  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:./META-INF/jdbc.properties" />
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:./META-INF/hibernate.cfg.xml" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
        </props>
    </property>

    <property name="mappingResources">
<list>
      <value>classpath:./META-INF/EntityMapping.hbm.xml</value>
</list>
 </property>
</bean>

<tx:annotation-driven transaction-manager="txManager" />

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

cuando comienzo mis pruebas unitarias, obtengo la siguiente excepción:

org.springframework. La excepción anidada es org.springframework.beans.factory.BeanCreationException: Error al crear el bean con el nombre 'xmlBooksource' definido en el recurso de ruta de clase [META-INF / beans.xml]: No se puede resolver la referencia al bean 'sessionFactory' mientras se configura la propiedad del bean 'sessionFactory '; la excepción anidada es org.springframework.beans.factory.BeanCreationException: Error al crear un bean con el nombre 'sessionFactory' definido en el recurso de ruta de clase [META-INF / beans.xml]: Error al invocar el método init; La excepción anidada es java.io.FileNotFoundException: recurso de ruta de clase [classpath: /META-INF/EntityMapping.hbm.xml] no se puede abrir porque no existe

Se lanza la misma excepción cuando escribo

<property name="mappingResources">
<list>
      <value>EntityMapping.hbm.xml</value>
</list>
 </property>

¿Por qué Spring no puede encontrar este archivo y cómo debo completar su ubicación para que este código funcione?

Gracias de antemano.

preguntado el 06 de noviembre de 11 a las 15:11

Como escribí al principio de la pregunta, sí. META-INF es una subcarpeta de src, por lo que puedo asumir que incluirlo en sourcepath no resolverá el problema.

Derecha. ¿Ha intentado quitar el classpath: ¿prefijo? Al mirar el código, ese definidor ya espera un recurso classpath. La cadena luego se pasa a ClassLoader.getResourceAsStream(String). -

@Gray gracias! Resuelve el problema. -

3 Respuestas

¿Ha intentado quitar el classpath: ¿prefijo? Al mirar el código de Hibernate, el mappingResources El setter espera que pase las cadenas a new ClassPathResource(String). Esto ya espera recursos de classpath. La cadena luego se pasa a ClassLoader.getResourceAsStream(String). Ninguno de este código eliminaría el prefijo "classpath:" del frente de la cadena de recursos.

respondido 06 nov., 11:20

No estoy seguro de que el mensaje de error sea coherente con el contenido beans.xml que publicó. En el error tienes

[classpath:/META-INF/EntityMapping.hbm.xml]

que no es lo mismo que

 classpath:./META-INF/EntityMapping.hbm.xml

Observe el "." Que falta. al principio en el error.

La segunda configuración beans.xml, probablemente debería producir un mensaje de error diferente con:

[classpath:EntityMapping.hbm.xml]

Esto sería buscar el archivo en la raíz de su aplicación compilada (jar, war, explotó, lo que sea).

respondido 06 nov., 11:19

El punto inicial en la ruta simplemente se omite en el mensaje de error. Lo he intentado una vez más ahora mismo. - Grook

He configurado correctamente Hibernate 4 con Spring 3.1. Mi archivo applicationContext.xml está dentro de la carpeta web-inf y tiene la siguiente configuración de hibernación:

<!-- Session Factory Declaration -->
 <bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
  <property name="dataSource" ref="DataSource" />
  <!--  
  <property name="annotatedClasses">
   <list>
    <value>iltaf.models.Levels</value>
   </list>
  </property>
  -->

    <property name="mappingLocations" value="classpath:iltaf/models/*.hbm.xml" />


    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>

  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
    <prop key="hibernate.show_sql">true</prop>
   </props>
  </property>
 </bean>

 <!-- Enable the configuration of transactional behavior based on annotations -->
    <tx:annotation-driven transaction-manager="txManager"/>

 <!-- Transaction Manager is defined -->
    <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
       <property name="sessionFactory" ref="SessionFactory"/>
    </bean>

</beans>

y tengo un archivo hibernate.cfg.xml separado dentro de mi carpeta src. Estoy usando la versión Eclipse Juno Java EE.

Respondido 22 Feb 13, 00:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.