多模块Spring-Hibernate-Maven Web应用程序,弹簧不解析实体/ daos

时间:2014-10-26 13:02:41

标签: java spring hibernate maven tomcat

我有一个奇怪的问题,我认为这与Spring有关。我正在开发一个Maven多模块应用程序,结构如下:

  • DataModule(包括一般的Hibernate实体和daos)
  • ServiceModule(包括特定的Hibernate实体和daos) - 取决于DataModule
  • Web(gwt web module) - 取决于ServiceModule

DataModule 中,我是一个经典的Spring-Hibernate xml配置,由(相关代码)组成:

的applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans ..>

<!-- Auto scan the components -->
<context:annotation-config />
<context:component-scan base-package="com.x.dataModule" >

<context:include-filter type="regex" 
                   expression="com.x.dataModule.dao.*" />

</context:component-scan>

<!-- Import resources -->
<import resource="applicationContext-hibernate.xml" />
<import resource="applicationContext-dataSource.xml" />

</beans>

的applicationContext-hibernate.xml

<beans ..>

<bean id="defaultLobHandler"  class="org.springframework.jdbc.support.lob.DefaultLobHandler" />

<!-- Hibernate session factory -->
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean ">

<property name="packagesToScan" value="com.x.dataModel.model.**.*"></property> 
    <property name="configLocation" value="classpath:hibernate.cfg.xml" />
    <property name="lobHandler" ref="defaultLobHandler" />
    <property name="dataSource" ref="dataSource" />

    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.query.substitutions">true 1, false 0</prop>
            <prop key="hibernate.connection.useUnicode">true</prop>
            <prop key="hibernate.connection.charSet">UTF8</prop>
        </props>
    </property>

</bean>

<!-- Transaction Manager -->
<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

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



<bean id="persistenceExceptionTranslationPostProcessor"
class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>


</beans>

Hibernate.cfg实际上是空的,因为我的目标是避免因使用 packagesToScan 属性而进行显式映射。 applicationContext-dataSource不相关,因为它包含ds配置。

ServiceModule 依赖于之前的模块。

的applicationContext.xml

<beans ...>

<!-- Auto scan the components -->

  

<context:include-filter type="regex" 
                   expression="com.x.serviceModule.dao.*" />

<context:include-filter type="regex" 
                   expression="com.x.serviceModule.manager.*" />

<!-- Import resources -->
<context:property-override location="classpath:override.properties"/>
<import resource="classpath*:/applicationContext-hibernate.xml" />
<import resource="classpath*:/applicationContext-dataSource.xml" />

</beans>

文件 override.properties 包含以下条目,用于修改 packagesToScan

的定义

sessionFactory.packagesToScan=com.x.*.model.**.*

此时一切正常。 serviceManagers(单例)从工厂加载

ApplicationContext appContext = new ClassPathXmlApplicationContext(
                "applicationContext.xml").getBean(..);

一切都表现得像预期的那样。

最后一部分,网络模块。如果我导入ServiceModule并将其作为Java应用程序进行测试,那么一切都很好。 但是,如果我将模块作为Web应用程序启动,则会失败,抱怨它无法加载DataModule中定义的实体/ daos。

网络模块中的相关文件:

WEB-INF /弹簧 applicationContext.xml:除了导入applicationContext-security.xml(驻留在同一目录中)之外没有其他内容

的web.xml

<!-- Spring context -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        WEB-INF/spring/applicationContext.xml
    </param-value>
</context-param>

<!-- Creates the Spring Container -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>

避免此问题的唯一方法是在DataModule xml文件中明确声明实体映射和daos定义

我的问题:是否有办法避免此类声明,并完全依赖于Web模块中的组件/包扫描?

我不太确定,但看起来春天网络环境与我的其他春天环境相冲突。否则,我不明白为什么一切都像Java应用程序一样好,但是作为网络失败了。 此外(不确定是否相关)似乎会话工厂bean在此过程中被解析两次(不应该是单身?)。

Spring版本是3.1.1版本,Hibernate 3.6.0 Final(4.0.1 for commons-annotations)。 Tomcat 7用于部署。

我没有提供实体/ daos /经理的Java代码,因为我不认为它与问题相关;但是,如果有任何帮助,我可以提供。非常感谢

0 个答案:

没有答案