我有一个奇怪的问题,我认为这与Spring有关。我正在开发一个Maven多模块应用程序,结构如下:
在 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代码,因为我不认为它与问题相关;但是,如果有任何帮助,我可以提供。非常感谢