@Inject com lista de Implementações

8 respostas
marcio89
@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:

public interface IDefaultGroupProvider extends IGroupProvider {

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

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

}

8 Respostas

marcio89

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

Valeu.

marcio89

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

marcio89

@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 ?

Lucas_Cavalcanti

tentou receber no construtor ao inves do @Inject?

marcio89

Sim, não funcionou.

Lucas_Cavalcanti

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.

marcio89
@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;
	}

}
public interface IDefaultGroupProvider extends IGroupProvider {

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

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

}

Continua vazio.

marcio89

Mudei pra List e funcionou.
Parece até pegadinha!

Valeu Lucas.

Criado 25 de julho de 2013
Ultima resposta 26 de jul. de 2013
Respostas 8
Participantes 2