8 de dez de 2012

Spring Injection - NoSuchBeanDefinitionException: No unique bean of type


Como vimos no post anterior, injeção de dependência é o bicho. Usando annotations o trabalho fica ainda mais simples. Mas como nem tudo nessa vida são flores...

Vamos imaginar o seguinte cenário. Usando o mesmo exemplo do post anterior, com uma modificação. Agora Printer é uma interface com duas implementações:

Printer.java
public interface Printer {
    
    void print(String text);
    
}

ConsolePrinter.java
@Component
public class ConsolePrinter implements Printer{

    public void print(String text) {
        System.out.print(text);
    }
    
}

FilePrinter.java
@Component
public class FilePrinter implements Printer{

    public void print(String text) {
        ...
    }   
}

Compile o programa... Opa, funcionou!

Execute o programa... Ops!!! Runtime Exception.

org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.springinjectionexample2.Printer] is defined: expected single matching bean but found 2: [consolePrinter, filePrinter]

E agora???

O Spring não é vidente, existem dois beans que implementam a interface Printer. Você precisa indicar qual deles deseja usar.

O @Qualifier vai nos ajudar. Vamos fazer uma pequena modificação no AppServices.java
@Service
public class AppServices {
    
    @Autowired
    @Qualifier("consolePrinter") //ou @Qualifier("filePrinter")
    private Printer printer;
    
    public void print(String text){
        printer.print(text);
    }
    
    public void print(Integer number){
        if(number!=null)
            printer.print(number.toString());
    }   
}

Pronto, agora o Spring já sabe qual bean deve utilizar!

O ensinamento de hoje foi esse, pequeno Padawan! May the Java be with you!

Código Fonte: http://depositfiles.com/files/fkrwow6mr

É isso ae, cambada. Aqui é Java!

Nenhum comentário:

Postar um comentário