0

我正在使用Spring4。 我有3个类:MyController,ADao和BDao。Spring依赖注入失败

viewAs()方法在MyController类中调用ADao中的getAs()方法, getao()方法从ADao调用BDao中的getB()方法。

ADao类中的SessionFactory对象被注入,但BDao类中的sessionFactory对象没有被注入。 我的问题是为什么它没有被注入?由于BDao类中sessionFactory对象为null,所以我得到Null指针异常。

是因为我从另一个dao打电话给一个dao吗?

@Controller 
public class MyController { 
    @Autowired 
    private ADao aDao; 

    @RequestMapping(value="viewAllItems") 
    public String viewAs(HttpServletRequest req, HttpServletResponse res){ 
     List<Item> list = new ArrayList<Item>(); 
     list = aDao.getAs(); 
     return ""; 
    } 
} 

@Repository 
public class ADao { 
    @Autowired 
    private SessionFactory sessionFactory;//objected gets injected. 

    public ADao(){} 

    public List<A> getAs() throws HibernateException{ 
     session = sessionFactory.openSession(); 
     tx = session.beginTransaction(); 
     new B().getB(null); 

     return null; 
    } 
} 

@Repository 
public class BDao { 

    @Autowired 
    private SessionFactory sessionFactory; 

    private Session session; 

    public BDao(){} 

    public void getB(B b) throws HibernateException{ 
     session = sessionFactory.openSession();// Object does not get injected. Causes NullPointerException 
    } 
} 

编辑: 调度-servlet.xml中

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:p="http://www.springframework.org/schema/p" 
    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.0.xsd 
     http://www.springframework.org/schema/mvc 
     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
         http://www.springframework.org/schema/context 
         http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <!-- JSR-303 support will be detected on classpath and enabled automatically --> 
    <mvc:annotation-driven/> 

     <context:component-scan base-package="com.karmacrafts.web.controller" /> 
     <context:component-scan base-package="com.karmacrafts.model.dao"/> 
     <context:property-placeholder location="classpath:application.properties" /> 
     <context:annotation-config/> 

     <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
      <property name="viewClass" 
       value="org.springframework.web.servlet.view.JstlView" /> 
      <property name="prefix" value="/WEB-INF/jsp/" /> 
      <property name="suffix" value=".jsp" /> 
     </bean> 


      <bean id="sessionFactory" 
      class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
       <property name="dataSource" ref="dataSource" /> 
       <property name="packagesToScan" value="com.karmacrafts.model.impl" /> 
       <property name="hibernateProperties"> 
       <props> 
        <prop key="hibernate.dialect">${jdbc.dialect}</prop> 
       </props> 
       </property> 
      </bean> 

      <bean id="dataSource" 
      class="org.apache.tomcat.dbcp.dbcp.BasicDataSource"> 
       <property name="driverClassName" value="${jdbc.driverClassName}" /> 
       <property name="url" value="${jdbc.databaseurl}" /> 
       <property name="username" value="${jdbc.username}" /> 
       <property name="password" value="${jdbc.password}" /> 
      </bean> 

      <bean id="transactionManager" 
      class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
       <property name="sessionFactory" ref="sessionFactory" /> 
      </bean> 

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


     <bean id="ADao" class="com.ADao" /> 
     <bean id="BDao" class="com.BDao"/> 
</beans> 
+0

请更新与应用程序上下文XML文件,你的问题。 – 2014-09-02 21:34:25

+4

在新B中使用new运算符的时刻()。getB(null); - 它不再是一个spring管理bean,所以B中的自动装入sessionFactory将不起作用。 – Prasad 2014-09-02 21:37:28

+0

@Prasad这似乎是正确的。谢谢。如果你可以重新发表你的评论作为答案,我会接受它。 – Susie 2014-09-02 21:43:50

回答

1

在ADAO类getAs()方法替换new B(),您正在使用新的运营商作为

new B().getB(null); 

,这是不是一个春天的托管Bean。所以自动装配将无法获取注入到BDao类中的sessionFactory。

相反,你可以通过为自动装配在ADAO注入BDAO:

@Repository 
public class ADao { 
    @Autowired 
    private BDao bdao;//use this to call getB method 
    ... 
} 
1

添加在ADAO类如下:

**@Autowired 

private BDao bdao;//objected gets injected.** 

而且使用这个对象调用BDAO方法,而比使用新运营商

1

当你说new B()你从Spring上下文。你自己创建了一个bean,它没有从spring上下文注入任何东西。与context.getBean()

或者自动装配BDAO在ADAO