Problema com dependencias

Ola galera sou novo por aqui, e no java também o meu problema é o seguinte.

estou tentando resolver uns exercicios da caelum fj21 13.5 pra ser mais especifico e to tentando injetar dependencias.

estou tentando injetar dependencia da classe JdbcTarefaDao na TarefaController mas o servidor jetty reclama dizendo que a JdbcTarefaDao nao pode ser uma bean e entao nao pode enjetar a dependencia

quem puder ajudar fico grato

Para ajudar aqui vai o erro que esta retornando

2013-04-13 23:03:04.444:WARN::/fj21-tarefas/loginForm: javax.servlet.UnavailableException: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘tarefasController’ defined in file [D:\Files User\workspace\fj21-tarefas\build\classes\br\com\caelum\tarefas\controller\TarefasController.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [br.com.caelum.jdbc.dao.JdbcTarefaDao]: : No qualifying bean of type [br.com.caelum.jdbc.dao.JdbcTarefaDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: null; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [br.com.caelum.jdbc.dao.JdbcTarefaDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: null

Para ajudar aqui vai o erro que esta retornando

2013-04-13 23:03:04.444:WARN::/fj21-tarefas/loginForm: javax.servlet.UnavailableException: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘tarefasController’ defined in file [D:\Files User\workspace\fj21-tarefas\build\classes\br\com\caelum\tarefas\controller\TarefasController.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [br.com.caelum.jdbc.dao.JdbcTarefaDao]: : No qualifying bean of type [br.com.caelum.jdbc.dao.JdbcTarefaDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: null; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [br.com.caelum.jdbc.dao.JdbcTarefaDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: null

Também estou passando por esse problema, a minha classe connection factory para funcionar tinha que conter um código que a apostila diz que não precisava:

static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (Exception e) { e.printStackTrace(); } }

A declaração no spring-context.xml:

<bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.myslq.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/caelum" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean>

A Classe DAO + construtor:

[code]import sun.jdbc.odbc.ee.DataSource;

@Repository
public class TarefaDAO {

private final Connection connection;

@Autowired
public TarefaDAO(DataSource dataSource){
	try {
		this.connection = dataSource.getConnection();
	} catch(SQLException e) {
		throw new RuntimeException(e);
	}
}[/code]

Mas a declaração no XML do Spring parece suprir a necessidade desse código então acho que não é isso.

Tomcat 7.0
Spring 3.2.2
commons-dbcp-1.4
commons-pool-1.6

Problema resolvido, meus códigos ficaram assim:

spring-context.xml:

<bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource">
  	<property name="driverClassName" value="org.gjt.mm.mysql.Driver" />
  	<property name="url" value="jdbc:mysql://localhost:3306/caelum" />
  	<property name="username" value="root" />
  	<property name="password" value="root" />
</bean>

TarefaDAO:

import org.apache.commons.dbcp.BasicDataSource;

@Repository
public class TarefaDAO {
	
	private final Connection connection;
	
	@Autowired
	public TarefaDAO(BasicDataSource dataSource){
		try {
			this.connection = dataSource.getConnection();
		} catch(SQLException e) {
			throw new RuntimeException(e);
		}
	}

Estou com o mesmo problema:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘tarefasController’ defined in file [/home/paulo/Downloads/apache-tomcat-7.0.39/wtpwebapps/fj21-tarefas/WEB-INF/classes/br/com/caelum/tarefas/controller/TarefasController.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [br.com.caelum.dao.JdbcTarefaDao]: : No qualifying bean of type [br.com.caelum.dao.JdbcTarefaDao] 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.caelum.dao.JdbcTarefaDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:730)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:196)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1051)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:955)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:490)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)

[code]package br.com.caelum.tarefas.controller;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;

import br.com.caelum.dao.JdbcTarefaDao;
import br.com.caelum.tarefa.modelo.Tarefa;

@Controller
public class TarefasController {
private final JdbcTarefaDao dao;

@Autowired
public TarefasController(JdbcTarefaDao dao) {
	this.dao = dao;
}

@RequestMapping("novaTarefa")
public String form() {
	return "tarefa/formulario";
}

@RequestMapping("adicionaTarefa")
public String adiciona(@Valid Tarefa tarefa, BindingResult result) {
	if (result.hasFieldErrors("descricao")) {
		return "tarefa/formulario";
	}

	dao.adiciona(tarefa);
	return "tarefa/adicionada";
}

@RequestMapping("listaTarefas")
public String lista(Model model) {
	model.addAttribute("tarefas", dao.lista());
	return "tarefa/lista";
}

@RequestMapping("removeTarefa")
public String remove(Tarefa tarefa) {
	dao.remove(tarefa);
	return "redirect:listaTarefas";
}

@RequestMapping("mostraTarefa")
public String mostra(Long id, Model model) {
	model.addAttribute("tarefa", dao.buscaPorId(id));
	return "tarefa/mostra";
}

@RequestMapping("alteraTarefa")
public String altera(Tarefa tarefa) {
	dao.altera(tarefa);
	return "redirect:listaTarefas";
}

@RequestMapping("finalizaTarefa")
public String finaliza(Long id, Model model) {
	dao.finaliza(id);
	model.addAttribute("tarefa", dao.buscaPorId(id));
	return "tarefa/finalizada";
}

}[/code]

[code]package br.com.caelum.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import br.com.caelum.tarefa.modelo.Tarefa;

@Repository
public class JdbcTarefaDao {
private final Connection connection;

@Autowired
public JdbcTarefaDao(BasicDataSource dataSource) {
	try {
		//Class.forName("com.mysql.jdbc.Driver");
		this.connection = dataSource.getConnection();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		throw new RuntimeException(e);
	}
}

public void adiciona(Tarefa tarefa) {
	String sql = "insert into tarefas " + "(descricao,finalizado)"
			+ " values (?,?)";

	try {
		PreparedStatement stmt = connection.prepareStatement(sql);

		stmt.setString(1, tarefa.getDescricao());
		stmt.setBoolean(2, Boolean.FALSE);

		stmt.execute();
		stmt.close();
	} catch (SQLException e) {
		throw new RuntimeException(e);

	}

}

public List<Tarefa> lista() {
	String sql = "select * from tarefas";
	List<Tarefa> tarefas = new ArrayList<Tarefa>();

	try {
		PreparedStatement stmt = connection.prepareStatement(sql);
		ResultSet rs = stmt.executeQuery();
		while (rs.next()) {
			Tarefa tarefa = new Tarefa();
			tarefa.setId(rs.getLong("id"));
			tarefa.setDescricao(rs.getString("descricao"));
			tarefa.setFinalizado(rs.getBoolean("finalizado"));
			Calendar data = Calendar.getInstance();
			if (rs.getDate("dataFinalizacao") != null) {
				data.setTime(rs.getDate("dataFinalizacao"));
				tarefa.setDataFinalizacao(data);
			} else {
				tarefa.setDataFinalizacao(null);
			}
			// data.setTime(rs.getDate("dataFinalizacao"));
			// tarefa.setDataFinalizacao(data);
			tarefas.add(tarefa);

		}
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		throw new RuntimeException(e);
	}
	return tarefas;
}

public void remove(Tarefa tarefa) {
	String sql = "delete from tarefas where id=?";
	try {
		PreparedStatement stmt = connection.prepareStatement(sql);
		stmt.setLong(1, tarefa.getId());
		stmt.execute();
		stmt.close();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		throw new RuntimeException(e);
	}

}

public Tarefa buscaPorId(Long id) {
	String sql = "select * from tarefas where id=?";
	Tarefa tarefa = new Tarefa();
	try {
		PreparedStatement stmt = connection.prepareStatement(sql);
		stmt.setLong(1, id);
		ResultSet rs = stmt.executeQuery();
		rs.next();

		tarefa.setId(rs.getLong("id"));
		tarefa.setDescricao(rs.getString("descricao"));
		tarefa.setFinalizado(rs.getBoolean("finalizado"));
		Calendar data = Calendar.getInstance();
		if (rs.getDate("dataFinalizacao") != null) {
			data.setTime(rs.getDate("dataFinalizacao"));
			tarefa.setDataFinalizacao(data);
		} else {
			tarefa.setDataFinalizacao(null);
		}
		rs.close();
		stmt.close();
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
	return tarefa;
}

public void altera(Tarefa tarefa) {
	String sql = "update tarefas set descricao=?,finalizado=?,dataFinalizacao=? "
			+ "where id=?";
	try {
		PreparedStatement stmt = connection.prepareStatement(sql);
		stmt.setString(1, tarefa.getDescricao());
		stmt.setBoolean(2, tarefa.isFinalizado());
		stmt.setDate(3, new Date(tarefa.getDataFinalizacao().getTimeInMillis()));
		stmt.setLong(4, tarefa.getId());
		stmt.execute();
		stmt.close();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		throw new RuntimeException(e);
	}
	

}

public void finaliza(Long id) {
	String sql = "update tarefas set finalizado=?,dataFinalizacao=? where id =?";
	try {
		PreparedStatement stmt = connection.prepareStatement(sql);
		stmt.setBoolean(1, Boolean.TRUE);
		Calendar data = Calendar.getInstance();			
		stmt.setDate(2, new Date(data.getTimeInMillis()));
		stmt.setLong(3, id);
		stmt.execute();
		stmt.close();
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
	
}

}
[/code]

[code]<?xml version="1.0" encoding="UTF-8"?>

<context:component-scan base-package=“br.com.caelum.tarefas” />
<mvc:annotation-driven />




<mvc:default-servlet-handler />

<mvc:interceptors>
	<bean class="br.com.caelum.tarefas.interceptor.AutorizadorInterceptor" />
</mvc:interceptors>

<bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource">
	<property name="driverClassName" value="org.gjt.mm.mysql.Driver" />
	<property name="url" value="jdbc:mysql://localhost/fj21" />
	<property name="username" value="root" />
	<property name="password" value="root" />
</bean>
[/code]

Alguém sabe a causa do erro?

Eu adicionei a seguinte linha no spring-context.xml e funcionou:

Mas a anotação Repository não era pra estar fazendo isso?

Descobri. No spring-context.xml tem a seguinte linha:

<context:component-scan base-package=“br.com.caelum.tarefas” />

Acontece que o DAO estava fora do pacote tarefas…

estava no pacote br.com.caelum.dao, refatorei para br.com.caelum.tarefas.dao e funcionou apenas com a anotação @Repository.

1 curtida

Valeu phenriquemoura! Tava cometendo o mesmo erro…
Gênio! rs

[quote=raphoso]Valeu phenriquemoura! Tava cometendo o mesmo erro…
Gênio! rs[/quote]

Você tem o arquivo tarefas.css do exercício 13.7?

[quote=phenriquemoura][quote=raphoso]Valeu phenriquemoura! Tava cometendo o mesmo erro…
Gênio! rs[/quote]

Você tem o arquivo tarefas.css do exercício 13.7?[/quote]

Alguém postou aqui:

Não tenho cara… Na verdade eu não estou fazendo a apostila, mas estava exatamente com o mesmo problema

[quote=phenriquemoura]Descobri. No spring-context.xml tem a seguinte linha:

<context:component-scan base-package=“br.com.caelum.tarefas” />

Acontece que o DAO estava fora do pacote tarefas…

estava no pacote br.com.caelum.dao, refatorei para br.com.caelum.tarefas.dao e funcionou apenas com a anotação @Repository.[/quote]

Valew phenriquemoura também me deparei com este problema, só uma observação:

<context:component-scan base-package=“br.com.caelum” />

também funciona e não há a necessidade de refatorar (renomear) o pacote que está a classe do seu Dao. Assim o spring cria qualquer componente nos pacotes dentro de “br.com.caelum” .

1 curtida

Odenilton, bom dia!

O seu problema, provavelmente, está ocorrendo porquê o tipo do DataSource, na classe, não é org.apache.commons.dbcp.BasicDataSource. O mesmo declarado no XML. Acredito que alterando para o tipo correto o problema será resolvido! Espero ter ajudado.

Atenciosamente,

Paulo André Moreira Cruz

Apenas para informar quem estiver na mesma situação.

Eu estava com o mesmo problema e a dica do pawloandre funcionou perfeitamente.

Eu estava referenciando a classe errada no xml do spring

Ola galera revivendo o tópico. Mas estou com este problema

Como não tem na apostila a implementação do jdbctarefadao eu estou com problemas em relação a conexão com o banco de dados. Olhei os códigos do pessoal mas cada um está colocando uma coisa. Eu não entendi a relação entre o spring.xml, o construtor na classe JdbcTarefaDao. Não entendi como instanciam um objeto de jdbctarefadao na classe TarefaController sendo que não passam argumentos para o construtor sendo que na implementação do construtor há argumentos. Realmente eu não entendi estas “ligações” digamos assim.

Obrigado a todos que tentarão ajudar

alguém galera?? preciso muito

Como disseram anteriormente , colocando a seguinte linha abaixo no spring-context.xml, resolveu o problema.