2011-10-21 18 views
9

que tiene una interfazconflictos Resolución de primavera con @Autowired y @Qualifier

public interface ParentService{} 

Y Dos Clase de implementación

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

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

Ahora mi controlador

public class ServeChild1Controller extendds AbstractController{ 

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

Del mismo modo hay ServeChild2Controller ..

Así que cuando corro me sale el siguiente error

error de ServeChild1Controller: No frijol única de tipo [com.service.ParentService] se define: frijol juego único de esperar, pero encontró 2 child1service, child2service

Am tratar de leer más acerca de estas anotaciones pero no es capaz de resolverla .. Cualquier indicador será de gran ayuda Gracias

+0

¿Qué versión de la primavera utiliza? – jeha

+0

resorte versión 3.0.5 estoy usando – harshit

Respuesta

17

Para utilizar una instancia específica que necesita para proporcionar Anotar el servicio con @Qualifier (ID) y en el constructor anotate el parámetro con @Qualifier de nuevo, de la siguiente manera:

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

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

Y constructor:

public class ServeChild1Controller extendds AbstractController{ 

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

} 
+0

¿es necesario especificar ID con la anotación de Servicio y Calificador? –

+1

@DaxJoshi: puede definirlo solo en '@ Qualifier' –

-1

creo que podría ser necesario proporcionar al mismo nivel que la anotación @Autowired la anotación @Qualifier .

+4

colocando @Qualifier encima del constructor no está permitido ... – harshit

0

Con Spring (beans) 4.3 funciona exactamente como lo escribiste en tu pregunta.

Puedo darle un ejemplo con el agrupamiento de implementación que enfrenté recientemente. Spring puede autoaumentarse según el tipo y la distinción del calificador. El uso de los nombres de los servicios no es suficiente, ya que deben ser únicos para que termine con el conflicto de tipos.

Ejemplo:

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) { 
} 
Cuestiones relacionadas