@Inject com lista de Implementações

@Inject List<IDefaultGroupProvider> groupProviders;

Tentei injetar uma lista de implementações e me retornaram esse erro:

No implementation for java.util.List<br.com.codery.prescreva.usercontrol.group.provider.IDefaultGroupProvider> was bound. while locating java.util.List<br.com.codery.prescreva.usercontrol.group.provider.IDefaultGroupProvider> for field at br.com.codery.prescreva.usercontrol.group.factory.DefaultGroupFactory.groupProviders(DefaultGroupFactory.java:13) at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:151)

O restante das classes:

[code]public interface IDefaultGroupProvider extends IGroupProvider {

}
[/code]

[code]public abstract class DefaultGroupProvider implements IDefaultGroupProvider {

protected abstract DefaultGroup getDefaultGroup();

protected abstract List<Permission> getPermission();

public Group provide() {
	Group group = new Group();
	group.setName(this.getDefaultGroup().getLabel());
	group.setPermissions(this.getPermission());
	return group;
}

}[/code]

[code]@Component
public class SystemAdminGroupProvider extends DefaultGroupProvider {

@Override
protected DefaultGroup getDefaultGroup() {
	return DefaultGroup.SYSTEM_ADMIN;
}

@Override
protected List<Permission> getPermission() {
	List<Permission> permissions = new ArrayList<Permission>();

	permissions.add(Permission.GROUP_SEE);
	permissions.add(Permission.GROUP_SAVE);
	permissions.add(Permission.GROUP_DELETE);
	permissions.add(Permission.GROUP_UPDATE);

	return null;
}

}[/code]

Resolvido.
List é uma interface e o Guice não sabe qual implementação pegar.
Mudei de List pra ArrayList e funcionou.

Valeu.

A lista tá vazia, e agora josé ?!

@Inject IDefaultGroupProvider groupProvider;

Isso funciona.

@Inject ArrayList<IDefaultGroupProvider> groupProviders;

Isso não.
Existe uma forma de fazer isso funcionar ? Ou seja, eu ter a lista de todas as superclasses que implementam IDefaultGroupProvider ?

tentou receber no construtor ao inves do @Inject?

Sim, não funcionou.

Se vc usa VRaptor com Guice, ele só registra a lista de implementações se vc recebe no construtor de alguma classe…

vc tem que receber uma List no construtor de uma classe, e ter pelo menos uma implementação de IDefaultGroupProvider anotada com @Component.

[code]@Component
public class DefaultGroupFactory implements GroupFactory {

ArrayList<IDefaultGroupProvider> groupProviders;

public DefaultGroupFactory(ArrayList<IDefaultGroupProvider> groupProviders) {
	this.groupProviders = groupProviders;
}

public List<Group> getList() {
	List<Group> groups = new ArrayList<Group>();
	for (IDefaultGroupProvider groupProvider : this.groupProviders) {
		groups.add(groupProvider.provide());
	}
	return groups;
}

}[/code]

[code]public interface IDefaultGroupProvider extends IGroupProvider {

}
[/code]

[code]public abstract class DefaultGroupProvider implements IDefaultGroupProvider {

protected abstract GroupType getDefaultGroup();

protected abstract List<Permission> getPermission();

public Group provide() {
	Group group = new Group();
	group.setName(this.getDefaultGroup().getLabel());
	group.setPermissions(this.getPermission());
	return group;
}

}[/code]

[code]@Component
public class SystemAdminGroup extends DefaultGroupProvider {

@Override
protected GroupType getDefaultGroup() {
	return GroupType.SYSTEM_ADMIN;
}

@Override
protected List<Permission> getPermission() {
	List<Permission> permissions = new ArrayList<Permission>();

	permissions.add(Permission.GROUP_SEE);
	permissions.add(Permission.GROUP_SAVE);
	permissions.add(Permission.GROUP_DELETE);
	permissions.add(Permission.GROUP_UPDATE);

	return null;
}

}[/code]

Continua vazio.

Mudei pra List e funcionou.
Parece até pegadinha!

Valeu Lucas.