Boa tarde. Estou fazendo o curso de Java pela apostila da Caelum, e no capítulo de Injeção de Dependências estou tendo o seguinte erro:
Error creating bean with name ‘tarefasController’ defined in file [C:\apache-tomcat-8.0.35\wtpwebapps\tarefas\WEB-INF\classes\br\com\tarefas\controller\TarefasController.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [br.com.tarefas.dao.TarefaDao]: : No qualifying bean of type [br.com.tarefas.dao.TarefaDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [br.com.tarefas.dao.TarefaDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
O projeto do curso tem a seguinte estrutura:
- Tarefa (DTO)
- TarefaDAO
- TarefasController
Antes desse capítulo, a conexão com banco era iniciada no construtor da DAO e estava tudo funcionando perfeitamente.
Nesse capítulo, estamos criando um DataSource no arquivo de contexto do Spring e colocando as anotações @Repository na TarefaDAO e @Autowired na TarefasController, e removendo a instanciação da DAO nos métodos da Controller. As diferenças da apostila pro meu caso são:
- Não estou usando banco MySQL e sim Oracle;
- Não tenho as bibliotecas do curso, então baixei pelo Maven;
Segue códigos:
• BIBLIOTECAS BAIXADAS NO MAVEN</>
<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-pool/commons-pool -->
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
• XML CONTEXTO SPRING - DATASOURCE (Oracle, na apostila é MySQL)
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@PC:1521:xe" />
<property name="username" value="usuario" />
<property name="password" value="senha" />
</bean>
• TAREFA DAO
@Repository
public class TarefaDao {
private Connection connection;
/* -- REMOVIDO NO CAPITULO DE INJEÇÃO DE DEPENDÊNCA, PARA USAR O DATASOURCE DEFINIDO NO XML
public TarefaDao() {
this.connection = new ConnectionFactory().getConnection();
}
*/
@Autowired
public TarefaDao(DataSource dataSource) {
try {
this.connection = dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
• TAREFA CONTROLLER
@Controller
public class TarefasController {
private final TarefaDao dao;
@Autowired
public TarefasController(TarefaDao dao) {
this.dao = dao;
}
@RequestMapping("novaTarefa")
public String form() {
return "tarefa/formulario";
}
@RequestMapping("listaTarefas")
public String lista(Model model) {
// TarefaDao dao = new TarefaDao();
model.addAttribute("tarefas", dao.lista());
return "tarefa/lista";
}