2013-12-17 140 views
2

我剛剛從春節3.1.1更新至3.2.6的Spring Java配置@Bean參數

隨着3.1下面的代碼運行良好以下情況除外:

所致: org.springframework.beans.factory.NoSuchBeanDefinitionException:無類型[javax.sql.DataSource中]的 排位豆發現DEP可能性: 預計至少有1個bean符合此依賴關係的條件,即符合條件的自動裝填候選人 。依賴註解: {@ org.springframework.beans.factory.annotation.Qualifier(值= DemoDataSource)}

我有多個數據源因此@Qualifier需要。

謝謝。

編輯:

看來,這解決了這個問題:

public DataSource dataSourceFactory() { 
    try 
    { 
     return (DataSource) demoDataSource().getObject(); 
    } 
    catch (Exception ex) 
    { 
     throw new RuntimeException(ex); 
    } 
} 

... 

sessionFactory.setDataSource(dataSourceFactory()); 

但是我不認爲這是一個很好的解決方案。

回答

0

根據您的需要稍微重寫您的配置。如果你真的不需要注入數據源,你可以做這樣的事情。

@Bean(name = DEMO_DS) 
public JndiObjectFactoryBean demoDataSource() { 
    JndiObjectFactoryBean factory = new JndiObjectFactoryBean(); 
    factory.setJndiName(JDBC_DEMO_DS); 
    factory.setProxyInterface(DataSource.class); 
    return factory; 
} 

@Bean(name = DEMO_SESSION_FACTORY) 
public SqlSessionFactoryBean demoSqlSessionFactory() { 
    SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); 
    sessionFactory.setDataSource(demoDataSource().getObject()); 
    sessionFactory.setConfigLocation(new ClassPathResource("demo/config.xml")); 
    return sessionFactory; 
} 

如果你需要有一個數據源注入你可能要切換到使用JndiLocatorDelegate做查詢,而不是一個JndiObjectFactoryBean

@Bean(name = DEMO_DS) 
public DataSource demoDataSource() throws NamingException { 
    return JndiLocatorDelegate.createDefaultResourceRefLocator().lookup(JDBC_DEMO_DS, DataSource.class); 
} 

這給你一個DataSource直接代替FactoryBean<Object>(這是JndiObjctFactoryBean是什麼)什麼可能是問題的根源。

或者(理論上)你應該也可以在配置類的屬性上使用@Value註解。而不是@Value正常的@Resource也應該這樣做(也可以將調用委託給JNDI進行查找)。

public class MyConfig { 

    @Value("${" + JDBC_DEMO_DS + "}") 
    private DataSource demoDs; 

} 

隨着@Resource

public class MyConfig { 

    @Resource(mappedName=JDBC_DEMO_DS) 
    private DataSource demoDs; 

} 

然後你就可以簡單地引用它在你的配置方法。

@Bean(name = DEMO_SESSION_FACTORY) 
public SqlSessionFactoryBean demoSqlSessionFactory() { 
    SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); 
    sessionFactory.setDataSource(demoDs); 
    sessionFactory.setConfigLocation(new ClassPathResource("demo/config.xml")); 
    return sessionFactory; 
}