2010-04-23 16 views
15

tengo 2 clases (B, C) se extiende clase A.Problema con Autowiring & No bean único

@Service 
public class A extends AbstratClass<Modele>{ 

    @Autowired 
    A(MyClass br) { 
     super(br); 
    } 


@Service 
public class B extends A{ 

    @Autowired 
    B (MyClass br) { 
    super(br); 
    } 



@Service 
public class C extends A{ 

    @Autowired 
    C (MyClass br) { 
    super(br); 
    } 

pero tengo este mensaje:

No bean única de tipo [A] ] se define: se espera frijol juego sencillo pero encontró 2: [a, B, moveModeleMarshaller]

que realmente no puede conseguir por qué tengo este mensaje & cómo resolver incluso después de leer documentatio primavera norte.

Gracias de antemano.

+0

yo también estoy recibiendo el mismo problema, pero no puede encontrar apropiado solución por favor ayúdenme ... gracias –

Respuesta

4

Está intentando (en otro lugar) conectar automáticamente un bean de tipo A. Algo como:

@Autowired 
private A beanA; 

Pero tiene 2 frijoles que se ajustan a esto.

Puede resolver esto mediante el uso @Resource y especificar qué exactamente frijol:

@Resource("b") 
private A beanA; 

(donde "b" es el nombre del bean inyectado) o el uso de la anotación @Qualifier.

14

Debe volver a escribir su clase a algo como esto con la anotación @Qualifier.

@Service 
@Qualifier("a") 
public class A extends AbstratClass<Modele>{ 

    @Autowired 
    A(MyClass br) { 
     super(br); 
    } 


@Service 
@Qualifier("b") 
public class B extends A{ 

    @Autowired 
    B (MyClass br) { 
    super(br); 
    } 

@Service 
@Qualifier("c") 
public class C extends A{ 

    @Autowired 
    C (MyClass br) { 
    super(br); 
    } 

También debe utilizar la anotación @Qualifier en la instancia de tipo A que estés Autowiring el grano de la primavera en.

Algo como esto:

public class Demo { 

    @Autowired 
    @Qualifier("a") 
    private A a; 

    @Autowired 
    @Qualifier("b") 
    private A a2; 

    public void demo(..) {..} 
} 

Si no les gusta tener esta configuración de primavera en el código de producción, hay que escribir la lógica de inyección de dependencia con XML o configuración de Java en su lugar.

También puede especificar un bean predeterminado de tipo A con la anotación @Primary encima de una de sus clases de servicio que extiende el tipo A. Entonces Spring puede autoconectarse sin especificar la anotación @Qualifier.

Dado que Spring nunca intentará adivinar qué bean inyectar, debe especificar cuál o marcar uno de ellos con @Primary, siempre que tenga más de un bean de un tipo.

+1

una opinión personal - Prefiero '@ Resource' para los casos más simples. – Bozho

+0

Son solo detalles menores, pero prefiero usar @Autowired o las nuevas anotaciones @Inject (JSR-330) en todos los casos. Una posible desventaja con @Resource y @Inject es que no los tienes en classpath ya que no es parte de Spring. – Espen

2

Generalmente obtendrá este error cuando se definen dos granos con una misma clase

<bean id="a" class="com.package.MyClass"/> 
<bean id="b" class="com.package.MyClass"/> 

si la dirección de la línea por encima de dos tenemos dos frijoles con una misma clase.

cuando se trata de Autowire esta clase en cualquier otro clasificará obtendrá este tipo de error

usted tiene dos soluciones

Primer método

  1. uso calificador definiendo un bean id init como este

    @Autowired 
    @Qualifier("a") 
    MyClass a; 
    
    @Autowired 
    @Qualifier("b") 
    MyClass b; 
    

Segundo método

uso JSR250 API (es un archivo jar que puede poner en su ruta de clase

luego hacer autowriring, como a continuación

@Resource("a") 
MyClass a 

@Resource("b") 
MyClass a 
Cuestiones relacionadas