Guice: Mensagem de erro enganosa com injetor filho

Criado em 7 nov. 2014  ·  11Comentários  ·  Fonte: google/guice

Se você tiver um injetor filho e pedir ao injetor pai um valor para uma ligação definida no filho, você receberá um erro "Já foi configurado em um ou mais injetores filho".

Seria melhor dizer "Nenhuma implementação para ... foi vinculada, embora esteja configurada em um injetor filho".

Aqui está um código de exemplo:

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;

public class GuiceBug {

    public static void main(String[] args) {
        Injector i1 = Guice.createInjector();
        Injector i2 = i1.createChildInjector(
                new AbstractModule() {
                        <strong i="8">@Override</strong>
                        protected void configure() {
                            bind(IStuff.class).to(Stuff.class);
                        }
                    });
        i1.getInstance(IStuff.class);
    }

    static interface IStuff {}

    static class Stuff implements IStuff {}
}
Exception in thread "main" com.google.inject.ConfigurationException: Guice configuration errors:

1) Unable to create binding for org.enercoop.test.GuiceBug$IStuff. It was already configured on one or more child injectors or private modules
    bound at org.enercoop.test.GuiceBug$1.configure(GuiceBug.java:15)
  If it was in a PrivateModule, did you forget to expose the binding?
  while locating org.enercoop.test.GuiceBug$IStuff

1 error
    at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004)
    at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:961)
    at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1013)
    at GuiceBug.main(GuiceBug.java:18)

Comentários muito úteis

Não posso deixar de pensar que @laurentmartelli estava certo sobre esse erro.

  • Com minha chamada bind , recebo este erro
  • Se eu comentar minha chamada bind , recebo " No implementation for ... was bound "

Como posso ter muitas ligações, remover uma ligação e não ter o suficiente?

Todos 11 comentários

O que te faz dizer que é enganoso? O erro está correto: você não pode obter a vinculação do pai porque está vinculada no filho. Liderar com "nenhuma implementação foi vinculada" parece mais enganoso, porque uma foi vinculada... apenas em um lugar diferente.

Dizer " estava configurado" me faz pensar que foi configurado duas vezes, o que não é o caso. Não sugere que foi configurado em outro lugar. Se você configurar uma ligação em pai e filho, também obterá "Uma ligação para ... foi configurada em ...".

Se você tem uma maçã e alguém pega aquela maçã, quando você tenta pegá-la o resultado é "Você não pode, alguém pegou a maçã". A maçã não foi tomada duas vezes. Quando você tenta pegá-lo (a primeira vez para você, a segunda vez no total), é dito que já foi tomado.

Esse é o mesmo. Você tenta criar uma vinculação no pai (por meio de obter uma vinculação que ainda não existe nele) e o resultado é que você é informado de que não pode criar a vinculação porque ela já foi configurada em um injetor filho.

Entendo seu ponto, mas ainda acho isso confuso, porque " Elementos do injetor filho não são visíveis para seu pai ". Então, se eu quero algo do pai que não está definido nele, ele falha apenas por causa disso, não por causa de algo definido ou não nos filhos.

Isso é incorreto. Ela falha precisamente porque está definida na criança. Se simplesmente não estivesse definido no pai, a associação seria criada em tempo de execução como uma associação just-in-time. No entanto, ele não pode criar a vinculação just-in-time, porque a vinculação já existe no filho, e o Guice não permite vinculações no pai e no filho.

Não posso deixar de pensar que @laurentmartelli estava certo sobre esse erro.

  • Com minha chamada bind , recebo este erro
  • Se eu comentar minha chamada bind , recebo " No implementation for ... was bound "

Como posso ter muitas ligações, remover uma ligação e não ter o suficiente?

fyi eu também achei isso extremamente confuso.

Os injetores infantis NB são extremamente confusos. Nós nos esforçamos para evitar usá-los internamente.

Sim, a mensagem de erro é confusa. No entanto, agora pesquisar no Google o erro dará essa discussão e permitirá que as pessoas o resolvam, apesar do texto. Obrigado @laurentmartelli!

+ 1 neste

Também foi confuso para mim, pesquisar essa discussão no Google acabou sendo a maneira mais rápida de encontrar a causa real, então a mensagem poderia muito bem ter um link para essa discussão.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

dxiao picture dxiao  ·  4Comentários

kamenik picture kamenik  ·  5Comentários

vgarmash picture vgarmash  ·  4Comentários

gissuebot picture gissuebot  ·  117Comentários

scottcarey picture scottcarey  ·  17Comentários