tags:

views:

191

answers:

2

I have 2 classes (B,C) extends class A.

@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);
  }

But i have this message:

No unique bean of type [A] ] is defined: expected single matching bean but found 2: [A, B, moveModeleMarshaller]

I really cant get why i have this message & how to resolve even after reading Spring documentation.

Thanks in advance.

+1  A: 

You are trying (somewhere else) to autowire a bean of type A. Something like:

@Autowired
private A beanA;

But you have 2 beans that conform to this.

You can resolve this by using @Resource and specifying which bean exactly:

@Resource("b")
private A beanA;

(where "b" is the name of the injected bean) or using the @Qualifier annotation.

Bozho
+1  A: 

You should rewrite your class to something like this with the @Qualifier annotation.

@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);
  }

You must also use the @Qualifier annotation on the instance of type A you're autowiring the Spring bean into.

Something like this:

public class Demo {

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

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

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

If you don't like to have this Spring configuration in your production code, you have to write the dependency injection logic with XML or Java configuration instead.

You can also specify a default bean of type A with the @Primary annotation above one of your service classes that extends type A. Then Spring can autowire without specifying the @Qualifier annotation.

Since Spring will never try to guess which bean to inject, you have to specify which one or mark one of them with @Primary as long as its more than one bean of a type.

Espen
a personal opinion - I prefer `@Resource` for the simpler cases.
Bozho
It's just minor details, but I prefer to use either @Autowired or the new @Inject (JSR-330) annotations in all cases. A possible downside with @Resource and @Inject is that you don't have them on classpath since it's not part of Spring.
Espen