Problema com dependencias

16 respostas
O

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

16 Respostas

O

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

G

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:

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);
		}
	}

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

G

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);
		}
	}
P

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)
...

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";
	}

}
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);
		}
		
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc
			http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
			http://www.springframework.org/schema/beans
			http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
			http://www.springframework.org/schema/context
			http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	<context:component-scan base-package="br.com.caelum.tarefas" />
	<mvc:annotation-driven />
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/" />
		<property name="suffix" value=".jsp" />
	</bean>
	<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>



</beans>

Alguém sabe a causa do erro?

P

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

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

P

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.

R

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

P

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

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

P

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

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

Alguém postou aqui:

R

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

J

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.

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” .

P

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

J

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

L

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

L

alguém galera?? preciso muito

I

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

Criado 14 de abril de 2013
Ultima resposta 18 de jun. de 2014
Respostas 16
Participantes 9