2013-01-06 79 views
0

我在主題Spring和Hibernate注入其他類

新我有配置

並嘗試把它注射

@Controller 
public class HelloController { 
    @Autowired 
    HibernateTemplate hibernateTemplate; 

    @RequestMapping(value = "/hello.htm", method = RequestMethod.GET) 
    public @ResponseBody String save() throws Exception { 
     hibernateTemplate.save(new Some(Long.valueOf("33"), Integer.valueOf("1"), Double.valueOf("1"), Short.valueOf("0")));  
    } 
} 

它的工作。

但如果我嘗試在其他類中使用@Autowired我有NPE 例如

public class SomeFacade extends AbstractFacade<Some> { 

    @Autowired 
    HibernateTemplate hibernateTemplate; 

    @Override 
    public HibernateTemplate getHibernateTemplate() { 
     return hibernateTemplate; 
    } 

} 

@Controller 
public class HelloController { 

    @RequestMapping(value = "/hello.htm", method = RequestMethod.GET) 
    public @ResponseBody String save() throws Exception { 
     SomeFacade df = new SomeFacade(); 
     HibernateTemplate ht = df.getHibernateTemplate(); 
    } 
} 

使用它,我有 「HT」 是空

我不知道該代碼中發生了什麼,以及爲什麼它不工作,我認爲這是因爲我的類沒有在xml文件中註冊。 請幫助這個例子。 謝謝!

+2

是的,這個工作,SomeFacade將需要一個Spring bean,並需要被注入到HelloContr中oller - 而不是HelloController構造它。 – GreyBeardedGeek

回答

1

像@GreybeardedGeek表示它需要成爲一個Spring bean。您可以添加註釋@Component到類,因此將被Spring管理:

@Component 
public class SomeFacade extends AbstractFacade<Some> { 

    @Autowired 
    HibernateTemplate hibernateTemplate; 

    @Override 
    public HibernateTemplate getHibernateTemplate() { 
     return hibernateTemplate; 
    } 

} 

不要忘了添加組件,掃描您的xml文件(根上下文),如果它已不存在:

<context:component-scan base-package="your.package" /> 

如果您使用此解決方案,注入的,而不是使用new關鍵字組件:

@Controller 
public class HelloController { 

    @Autowired 
    private SomeFacade df; 

    @RequestMapping(value = "/hello.htm", method = RequestMethod.GET) 
    public @ResponseBody String save() throws Exception { 
     HibernateTemplate ht = df.getHibernateTemplate(); 
    } 
}