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