2016-06-28 3 views
0

Я хочу создать два компонента, реализующих один и тот же интерфейс. Бобы имеют имена, но когда я использую @Qualifier аннотациюСоздание двух компонентов, реализующих один и тот же интерфейс

получил ошибку как:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cdPlayer' defined in soundsystem.CDPlayerConfig: Unsatisfied dependency expressed through method 'cdPlayer' parameter 0: No qualifying bean of type [soundsystem.CompactDisc] is defined: expected single matching bean but found 2: sss,aaa; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [soundsystem.CompactDisc] is defined: expected single matching bean but found 2: sss,aaa 

Это мой класс конфигурации.

@Configuration 
public class CDPlayerConfig { 

@Bean(name="bbb") 
public CompactDisc blankDisc(){ 
    List<String> list = new LinkedList<>(); 
    list.add("qwer"); 
    list.add("qazw"); 
    return new BlankDisc("one", "two", list); 
} 

@Bean(name="aaa") 
public CompactDisc sgtPeppers(){ 
    return null; 
} 
@Bean 
public MediaPlayer cdPlayer(CompactDisc cd){ 
    return new CDPlayer(cd); 
} 
} 

Это мой тестовый класс.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes=CDPlayerConfig.class) 
public class CDPlayerTest { 

@Rule 
public final SystemOutRule log = new SystemOutRule().enableLog(); 

@Autowired 
private MediaPlayer player; 

@Autowired 
@Qualifier("aaa") 
private CompactDisc cd; 

@Test 
public void cdShouldNotBeNull(){ 
    assertNotNull(cd); 
} 


@Test 
public void play(){ 
    player.play(); 
    assertEquals("XYZ", log.getLogWithNormalizedLineSeparator()); 
} 
} 

Edit: Мой CDPlayer класс

public class CDPlayer implements MediaPlayer { 

private CompactDisc cd; 

@Autowired 
public CDPlayer(CompactDisc cd){ 
    this.cd = cd; 
} 
@Override 
public void play() { 
    // TODO Auto-generated method stub 
    cd.play(); 
} 
} 

ответ

0

пружина пытается придать боб Compactdisc здесь:

@Bean 
public MediaPlayer cdPlayer(CompactDisc cd){ 
    return new CDPlayer(cd); 
} 

Вы должны добавить @Qualifier аннотацию к CompactDisc.

Другим способом является удаление параметра из CDPlayer конструктора и поместить его в качестве параметра метода воспроизведения

+0

Тем не менее не работает. Когда я использую аннотацию @Primary, она работает, но я хочу выбрать по имени. Я добавил код класса CDPlayer – lassa

+0

Удалите параметр из конструктора CDplayer и поместите его как параметр в метод воспроизведения. – Jens

+0

Он работает. Спасибо :) – lassa

2

Измените код следующим образом:

@Bean 
public MediaPlayer cdPlayer(@Qualifier("bbb") CompactDisc cd){ 
    return new CDPlayer(cd); 
} 
+0

Все еще не работает. Когда я использую аннотацию @Primary, она работает, но я хочу выбрать по имени. Я добавил код класса CDPlayer – lassa

Смежные вопросы