2012-10-08 81 views
2

我在自动装配和DI方面遇到了一些问题,所以我希望有人可以帮忙,因为我现在已经坚持了几天。春天 - 如何autowire数据源?

这是代码:

@Service 
public class TicketsController implements Controller { 
    private TicketManager ticketManager; 

    @Autowired 
public void setTicketManager(TicketManager ticketManager) { 
    this.ticketManager = ticketManager; 
} 
... 
} 


@Service 
public class SimpleTicketManager implements TicketManager { 
    private TicketsDao ticketsDao; 

@Autowired 
public void setTicketsDao(TicketsDao ticketsDao) { 
    this.ticketsDao = ticketsDao; 
} 
... 
} 

@Repository 
public class JdbcTicketDao implements TicketsDao { 
    private DataSource dataSource; 
    @Autowired 
    public void setDataSource(DataSource dataSource) { 
    this.dataSource=dataSource; 
     this.jdbcTemplate = new JdbcTemplate(this.dataSource); 
    } 
... 
} 

public final class AppContext { 
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 
BeanFactory factory = context; 
TicketsController ticketsController = (TicketsController) factory.getBean("ticketsController"); 
} 
... 
} 

在我的beans.xml我有:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClass" value="com.mysql.jdbc.Driver"/> 
    <property name="url" value="jdbc:mysql://localhost:3306/mytckdb"/> 
    <property name="username" value="user"/> 
    <property name="password" value="pass"/> 
</bean> 
<context:component-scan base-package="bp.dao" /> 
<context:component-scan base-package="bp.mvc" /> 
<context:component-scan base-package="bp.svc" /> 
<context:component-scan base-package="bp.view" /> 

这不工作,我得到:

Error creating bean with name 'jdbcTicketDao': Injection of autowired dependencies failed 
... nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
    No matching bean of type [javax.sql.DataSource] found for dependency.` 

灿有人请帮忙吗?我究竟做错了什么?看起来,自动装配工作直到下一步注入dataSource时失败。

编辑:我在玩代码,并忘记setDataSource()之前的@Autowire,但它应该在那里。

+1

错误消息似乎表明你想'@ Autowire'但显示的代码表示相反。你能澄清一下吗? – 2012-10-08 17:48:58

+0

对不起,忘了在setDataSource之前添加@Autowired,但它在那里,我有同样的问题。 – newman555p

+0

我疯狂的猜测是'beans.xml'在Spring中没有被看作applicationContext。如果你可以提供更多关于你如何“启动”的细节spring – 2012-10-08 17:54:02

回答

0

尝试org.apache.commons.dbcp.BasicDataSource

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver" 
     p:url="jdbc:mysql://127.0.0.1:3306/mytckdb?autoReconnect=true" 
     p:username="user" p:password="pass" /> 

我使用JPA所以一般喜欢创建的EntityManagerFactory和使用

<bean id="entityManagerFactory" 
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
      <property name="dataSource" ref="dataSource" /> 
      <property name="persistenceUnitName" value="PU" /> 
      <property name="jpaVendorAdapter"> 
       <bean id="jpaAdapter" 
        class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
        <property name="database" value="${database}" /> 
        <property name="showSql" value="true" /> 
        <property name="generateDdl" value="false" /> 
       </bean> 
      </property> 
     </bean> 

<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

    <tx:annotation-driven transaction-manager="txManager" /> 
+0

我得到同样的错误。我已经试过这个dataSource bean,因为我在搜索这个问题的解决方案时找到了它。我不能使这项工作:( – newman555p

+0

顺便说一句,我只是检查未下过@Autowired _private数据源数据源; _任何原因 – Anshu

+0

编辑:)它的存在在我的代码... – newman555p

2

也许你错过了布线结构,尽量

<context:annotation-config/>

+0

补充,但我STIL得到同样的错误:( – newman555p

0

看起来像你正在使用Spring 2.0,但我认为context:component-scan是在Spring 2.5中引入的。 也许更新spring xml-config和spring依赖关系到2.5

+0

我也没有运气。我放弃了:) – newman555p

0

变化

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClass" value="com.mysql.jdbc.Driver"/> 
    <property name="url" value="jdbc:mysql://localhost:3306/mytckdb"/> 
    <property name="username" value="user"/> 
    <property name="password" value="pass"/> 
</bean> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
    <property name="url" value="jdbc:mysql://localhost:3306/mytckdb"/> 
    <property name="username" value="user"/> 
    <property name="password" value="pass"/> 
</bean> 

的属性被称为driverClassName,不driverClass

而且,你不需要多context:component-scan元素可以更改

<context:component-scan base-package="bp.dao" /> 
<context:component-scan base-package="bp.mvc" /> 
<context:component-scan base-package="bp.svc" /> 
<context:component-scan base-package="bp.view" /> 

<context:component-scan base-package="bp.dao,bp.mvc,bp.svc,bp.view" /> 
0

这是由于bean实例创建的顺序。在创建dataSource实例之前,您的DAO已经被实例化。

让您的数据源bean定义之前

另一种方式是,在一个单独的XML定义你的数据源定义,并导入之前