2013-12-03 2 views
1

По какой-то причине у меня есть конфигурация моей фасоли весны как java config, а также некоторые другие компоненты, определенные в xml. Теперь я хочу ввести sessionfactory bean, определенный в xml config, в bean-компонент в java-config. К сожалению sessionfactory имеет значение null, и я получаю исключение NullPointerException. Что случилось? Я использую Spring 3.2.5. Также @Inject или @Autowired вместо @Resource не работает.Ввод SessionFactory из Spring XML-Config в Java-Config

Вот соответствующие части ...

Java Config:

@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-Config:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
... 
</bean 

Unit-тест:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = { MyJavaConfig.class }) 
public class MyBeanWiringTest { 
    // test fails with NPE 
} 

Почти полный beans-sessionfactor y.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> 
+0

Я не могу воспроизвести это. Вы уверены, что 'beans-sessionfactory.xml' содержит определение компонента' AnnotationSessionFactoryBean', которое вы нам показываете? –

+0

Несомненно, он также работает для моего приложения, настроенного на xml. Только для другого приложения, использующего конфигурацию Java Config и xml, он не работает. Существует NPE, как объясняется в вопросе. – Cengiz

+0

Также не работает проводка других компонентов из xml (NPE). – Cengiz

ответ

0

Проблемы здесь:

Bean метод MyJavaConfig.myAppConfig не является статичным и возвращает объект назначаемых к интерфейсу BeanFactoryPostProcessor Спринга. Это приведет к сбою обработки аннотаций, таких как @Autowired, @Resource и @PostConstruct в объявлении метода @Configuration. Добавьте «статический» модификатор к этому методу в , избегая этих проблем жизненного цикла контейнера; см @Bean Javadoc для полных деталей

Так после объявления myAppConfig статического это работает.

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

AnnotationSessionFactoryBean является FactoryBean<SessionFactory>, что означает, что он создает 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 вам придется прибегнуть к некоторому именованию обману. Вы должны ввести фасоль с именем «» »» »» »» »» «0», «0», & Это маркер, указывающий весне, что вы хотите получить FactoryBean вместо результата FactoryBean.

@Autowired 
@Qualifier("&sessionFactory") 
private AnnotationSessionFactoryBean sessionFactory; 
Смежные вопросы