2011-10-21 6 views
9

I mają interfejsuRozwiązywania Wiosna konflikt z @Autowired i @Qualifier

public interface ParentService{} 

i dwa implementacji klasy

@Service("child1service")  
public class Child1 implements ParentService{} 

@Service("child2service") 
public class Child2 implements ParentService{} 

teraz mój kontroler

public class ServeChild1Controller extendds AbstractController{ 

@Autowired 
public ServeChild1Controller(@Qualifier("child1service") ParentService child1service){ 
super(child1service) 
    } 

Podobnie jest ServeChild2Controller ..

Więc gdy uruchamiam otrzymuję następujący błąd

błędu dla ServeChild1Controller: Bez unikalny fasoli typu [com.service.ParentService] jest zdefiniowany: oczekuje pojedynczego dopasowania fasoli ale Znaleźliśmy 2 child1service, child2service

usiłuję dowiedzieć się więcej o tych adnotacji, ale nie jest w stanie go rozwiązać .. Wszelkie wskazówki będą pomocne Dzięki

+0

Jaka wersja Wiosna używacie? – jeha

+0

wersja wiosna 3.0.5 używam – harshit

Odpowiedz

17

W celu wykorzystania konkretnej instancji, czego potrzeba, aby zapewnić Opisywanie usługi @Qualifier (id) oraz w konstruktorze anotate parametr z @Qualifier znowu, jak następuje:

@Service("child1service") 
@Qualifier("child1service") 
public class Child1 implements ParentService{} 

@Service("child2service") 
@Qualifier("child2service") 
public class Child2 implements ParentService{} 

A ty konstruktora:

public class ServeChild1Controller extendds AbstractController{ 

    @Autowired 
    public ServeChild1Controller(@Qualifier("child1service") ParentService child1service){ 
     super(child1service) 
    } 

} 
+0

czy wymagane jest podanie identyfikatora z adnotacją Usługa i Kwalifikator? –

+1

@DaxJoshi: możesz zdefiniować go tylko w '@ Qualifier' –

-1

myślę adnotacji @Qualifier może trzeba mieć na tym samym poziomie jak @Autowired adnotacji .

+4

umieszczanie @Kwalifikator powyżej konstruktora jest niedozwolone .. – harshit

0

Ze sprężyną (ziarno) 4.3 działa dokładnie tak, jak napisałeś to w swoim pytaniu.

Mogę podać przykład z grupowaniem wdrożeń, z którym miałem ostatnio do czynienia. Wiosna może być autowarem w oparciu o rozróżnienie typu i kwalifikatora. Używanie nazw usług nie jest wystarczające, ponieważ muszą być unikatowe, aby doprowadzić do konfliktu typów.

Przykład:

public interface ServiceA {} 
public interface ServiceB {} 

@Qualifier("mockedA")  
@Service 
public class MockedA implements ServiceA {} 

@Qualifier("realA") 
@Service 
public class RealA implements ServiceA {} 

@Qualifier("mockedB")  
@Service 
public class MockedB implements ServiceB {} 

@Qualifier("realB") 
@Service 
public class RealB implements ServiceB {} 

@Autowired 
public ABController (
    @Qualifier("mockedA") ServiceA mockedA, 
    @Qualifier("realA") ServiceA realA, 
    @Qualifier("mockedB") ServiceB mockedB, 
    @Qualifier("realB") ServiceB realB) { 
}