【问题标题】:Inject SessionFactory from Spring XML-Config into Java-Config将 Spring XML-Config 中的 SessionFactory 注入 Java-Config
【发布时间】: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 包含您向我们展示的AnnotationSessionFactoryBean bean 定义吗?
  • 当然,它也适用于我的 xml 配置应用程序。仅对于使用 Java Config 和 xml config 的另一个应用程序,它不起作用。有问题中解释的 NPE。
  • 从 xml 连接其他 bean 也不起作用 (NPE)。
  • 您能向我们展示您的项目或类路径的图像吗?我也想看看beans-sessionfactory.xml的完整内容。
  • 不要注入AnnotationSessionFactoryBean,而是注入SessionFactory

标签: java spring


【解决方案1】:

AnnotationSessionFactoryBean 是一个FactoryBean&lt;SessionFactory&gt;,这意味着它创建了一个SessionFactory。您可以注入结果而不是工厂。

@Configuration
@ComponentScan
@ImportResource({ "classpath:beans-sessionfactory.xml" })
public class MyJavaConfig {

   @Autowired
   private SessionFactory sessionFactory;

   @Bean
   public MyDao getMyDao() {
      final MyDao dao = new MyDao();
      // Why is sessionFactory null?
      dao.setSessionFactory(this.sessionFactory);
      return dao;
   }

如果您真的想要AnnotationSessionFactoryBean,您将不得不使用一些命名技巧。你必须注入一个名为“&sessionFactory”的bean,注意&amp;,这是向spring表明你想要FactoryBean而不是FactoryBean的结果的标记。

@Autowired
@Qualifier("&sessionFactory")
private AnnotationSessionFactoryBean sessionFactory;

【讨论】:

    【解决方案2】:

    问题出在这里:

    Bean 方法 MyJavaConfig.myAppConfig 是非静态的,并返回一个 可分配给 Spring 的 BeanFactoryPostProcessor 接口的对象。 这将导致无法处理注释,例如 方法声明中的@Autowired、@Resource 和@PostConstruct @配置类。将“静态”修饰符添加到此方法以 避免这些容器生命周期问题;完整的见@Bean Javadoc 详情

    所以在声明 myAppConfig 静态之后它就可以工作了。

    @Bean
    public static MyAppConfig myAppConfig() {...}
    

    【讨论】:

      猜你喜欢
      • 2014-08-05
      • 1970-01-01
      • 2016-12-17
      • 2019-03-16
      • 1970-01-01
      • 2018-05-14
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多