【发布时间】:2013-12-20 05:32:49
【问题描述】:
出于某种原因,我将 spring beans 配置为 java config,并且在 xml 中定义了其他一些 beans。 现在我想将 xml 配置中定义的 sessionfactory bean 注入到 java 配置中的 bean 中。 不幸的是 sessionfactory 是空的,我得到一个 NullPointerException。 怎么了?我正在使用 Spring 3.2.5。 @Inject 或 @Autowired 而不是 @Resource 也不起作用。
以下是相关部分...
Java 配置:
@Configuration
@ComponentScan
@ImportResource({ "classpath:beans-sessionfactory.xml" })
public class MyJavaConfig {
// defined in 'beans-sessionfactory.xml'
@Resource
//@Inject => also NPE
//@Autowired => also NPE
private AnnotationSessionFactoryBean sessionFactory;
@Bean
public MyDao getMyDao() {
final MyDao dao = new MyDao();
// Why is sessionFactory null?
dao.setSessionFactory(this.sessionFactory.getObject());
return dao;
}
// MyAppConfig extends PropertyPlaceholderConfigurer
@Bean
public MyAppConfig myAppConfig() {...}
...
XML 配置:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
...
</bean
单元测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { MyJavaConfig.class })
public class MyBeanWiringTest {
// test fails with NPE
}
几乎完整的beans-sessionfactory.xml:
<?xml version="1.0" encoding="ISO-8859-15"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
<bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" lazy-init="true">...</bean>
<bean id="myProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">...</bean>
<bean id="hibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">...</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="hibernateProperties" ref="hibernateProperties"/>
<property name="annotatedClasses">
<list>
<value>MyEntity</value>
</list>
</property>
</bean>
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
</beans>
【问题讨论】:
-
我无法重现此内容。您确定
beans-sessionfactory.xml包含您向我们展示的AnnotationSessionFactoryBeanbean 定义吗? -
当然,它也适用于我的 xml 配置应用程序。仅对于使用 Java Config 和 xml config 的另一个应用程序,它不起作用。有问题中解释的 NPE。
-
从 xml 连接其他 bean 也不起作用 (NPE)。
-
您能向我们展示您的项目或类路径的图像吗?我也想看看
beans-sessionfactory.xml的完整内容。 -
不要注入
AnnotationSessionFactoryBean,而是注入SessionFactory。