2012-12-07 33 views
1

我有我的應用程序配置建立編程一個bean,而我輸入這樣的豆:春天 - 如何引用編程

@Configuration 
@ImportResource(value= { "classpath:myBean.xml"}) 
public class AppConfig extends WebMvcConfigurerAdapter 
{ 

而在myBean.xml我有這樣的:

<bean id="myBeanId" class="my.domain.myBeanClass"> 
    <property name="sessionFactory" ref="my_session_factory" /> 
    <property name="someOtherProperty"... 
    </bean> 

這工作正常,sessionFactory注入myBeanClass

但是,如果我嘗試以編程方式實例化同一個bean,那麼我會得到「沒有找到依賴關係...的[org.hibernate.SessionFactory]類型的匹配bean」錯誤。

@Configuration 
@Import(BeanConfig.class) 
public class AppConfig extends WebMvcConfigurerAdapter 
{ 

豆配置類:

@Configuration 
public class BeanConfig 
{ 
    @Autowired 
    private SessionFactory sessionFactory; 

    @Bean(name="myBeanId") 
    public MyBeanClass createMyBeanClass() 
    { 
    MyBeanClass mbc = new MyBeanClass(); 
    mbc.setSessionFactory(sessionFactory); 
    .... 
    return mbc; 

編輯:肯定是創建了一個SessionFactory豆,如果我添加所需= false將@Autowired,一旦一切都被載入然後手動注入SessionFactory的。它工作正常。

編輯2: 我沒有web.xml,我使用的是servlet 3,所以以編程方式聲明瞭所有內容。這是我的web.xml相當於

@Configuration 
public class WalletInitialiser implements WebApplicationInitializer 
{ 

    @Override 
    public void onStartup(ServletContext aServletContext) throws ServletException 
    { 
    AnnotationConfigWebApplicationContext mvcContext 
     = new AnnotationConfigWebApplicationContext(); 

    mvcContext.register(AppConfig.class); 
    mvcContext.scan("config.packages", "class.packages"); 
    aServletContext.addListener(new ContextLoaderListener(mvcContext)); 
    //add security filters, dispatcher to servlet, logback 

我已經在其他類配置我的SessionFactory,HibernateConfig在配置包,它正在從

mvcContext.scan("config.packages", "class.packages"); 

摘自這個類拿起是:

@Configuration 
@EnableTransactionManagement 
public class HibernateConfig 
{ 
    @Bean(name="my_session_factory") 
    public LocalSessionFactoryBean baseSessionFactory() 
    { 
    LocalSessionFactoryBean lsfb= new LocalSessionFactoryBean(); 
    lsfb.setPackagesToScan("class.packages"); 
    lsfb.setAnnotatedPackages("class.packages"); 

    //add hibernate props for datasource 
    return lsfb; 
    } 
} 
+0

你是否在上下文(myBean.xml)中打開了基於註解的配置? –

+0

你可以請你也展示你如何用你的容器(這個AppConfig的web.xml條目)配置了AppConfig,你也可能有另外一個配置你定義SessionFactory的權利,你能不能顯示配置也是 –

+1

這很奇怪,您使用的是annoation驅動的配置,但是然後從xml文件導入一個bean。你也可以放棄基於java的conifg註釋,因爲它依賴於xml。這是不必要的混淆。 – NimChimpsky

回答

1

此問題可能與How to make factoryBeans work...有關。雖然它不完全匹配Configuring Hibernate Session Factory可能會爲解決問題提供見解。

我建議嘗試此:

@Configuration 
public class BeanConfig { 
    @Autowired 
    private LocalSessionFactoryBean sessionFactoryBean; 

    @Bean(name="myBeanId") 
    public MyBeanClass createMyBeanClass() { 
     MyBeanClass mbc = new MyBeanClass(); 
     mbc.setSessionFactory((SessionFactory) sessionFactoryBean.getObject()); 
    .... 
    return mbc; 
    } 
} 

可能有其他的方式來解決這個問題,我沒有跟蹤的春天源論壇中提到的JIRA問題,他們可能會指向一個「標準」的方式。或者,Spring文檔可能會提供一些有關在java配置中處理FactoryBeans的信息。

+0

似乎這樣做。良好的聯繫也。非常感謝你。 – kwh