Polimorfismo vRaptor

Tenho a seguinte estrutura:

Repositorio

public interface Repositorio<T> {
	public void save(T entity);
	public void update(T entity);
	public void delete(T entity);
	public T load(Long id);
	public List<T> listAll();
}

DaoGEnerico:

[code]
public abstract class GenericDAO implements Repositorio {

private Class<T> entityClass;
private Session session;

public GenericDAO(Class<T> entityClass, Session sessao) {
	this.entityClass = entityClass;
	this.session = sessao;
}

public void save(T entity) {
	session.save(entity);
}

public void update(T entity) {
	session.update(entity);
}

public void delete(T entity) {
	session.delete(entity);
}

public T load(Long id) {
	return (T) this.session.get(entityClass, id);
}

public List<T> listAll() {
	return this.session.createCriteria(entityClass).list();
}

}[/code]

ProdutoDAO

@Component
public class ProdutoDAO extends GenericDAO<Produto> {
	
	public ProdutoDAO(Session sessao) {
		super(Produto.class, sessao);
	}

}

UsuarioDAO

@Component
public class UsuarioDAO extends GenericDAO<Usuario> {

	private Session sessao;
	
	public UsuarioDAO(Session sessao) {
		super(Usuario.class, sessao);
		this.sessao = sessao;
	}
	
	public Usuario buscaPorLogin(String email) {
		String hql = "select u from Usuario u where u.email = :email";
		Query consulta = this.sessao.createQuery(hql);
		consulta.setString("email", email);
		return (Usuario) consulta.uniqueResult();
	}
}

meu Controller:

@Resource
public class ProdutoController {
	
	private final Repositorio<Produto> prod;
	private final Result result;
	
	public ProdutoController(Repositorio<Produto> produto, Result result) {
		this.prod = produto;
		this.result = result;
	}
	
	public void formulario() {
		
	}
	
	public void salvar(Produto produto) {
		this.prod.save(produto);
		result.redirectTo(this).lista();
	}
	
	public List<Produto> lista() {
		return prod.listAll();
	}

}

Meu problema: quando injeto Repositorio em ProdutoController e vou na pagina para listar, ele nao entende quem deve implementar, se é UsuarioDAO ou ProdutoDAO, quando na verdade eu quero que em ProdutoController ele implemente ProdutoDAO.

Erro:

HTTP Status 500 - Error creating bean with name 'produtoController': Unsatisfied dependency expressed through constructor argument with index 0 of type [br.com.goodbuy.repositorio.Repositorio]: : No unique bean of type [br.com.goodbuy.repositorio.Repositorio] is defined: more than one 'primary' bean found among candidates: [usuarioDAO, produtoDAO]; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [br.com.goodbuy.repositorio.Repositorio] is defined: more than one 'primary' bean found among candidates: [usuarioDAO, produtoDAO]

é meu amigo vc vai ter que dizer qual DAO vc vai querer , o framework não tem como saber qual DAO vc quer mesmo vc tipando o Repository, porque quando a classe é compilada ela perde as tipagens, e sendo assim vc tera duas classes elegíveis a ser injetadas

o que vc pode fazer é deixar o atributo como Repository e no construtor colocar o parametro como ProdutoDao

@Resource  
public class ProdutoController {  
      
    private final Repositorio<Produto> prod;  
    private final Result result;  
      
    public ProdutoController(ProdutoDAO  produto, Result result) {  
        this.prod = produto;  
        this.result = result;  
    }  
      
    public void formulario() {  
          
    }  
      
    public void salvar(Produto produto) {  
        this.prod.save(produto);  
        result.redirectTo(this).lista();  
    }  
      
    public List<Produto> lista() {  
        return prod.listAll();  
    }  
  
}  

faz isso e vê se funciona