2017-02-15 29 views
1

CallingApp.javaКлассификатор не работает весной

@Service 
@ComponentScan(basePackages = { "com.codegeekslab.type" }) 
public class CallingApp { 

    @Autowired 
    @Qualifier("BasicPhone") 
    private Phone phone; 

    public CallingApp(Phone phone) { 
     this.phone = phone; 
    } 

    public void makeCall(int number) { 
     phone.openApp(number); 
    } 

} 

Phone.java

package com.geekslab.device; 

public interface Phone { 

    public void openApp(int number); 

} 

BasicPhone.java

package com.codegeekslab.type; 

import org.springframework.context.annotation.Primary; 
import org.springframework.stereotype.Component; 
import org.springframework.stereotype.Service; 

import com.geekslab.device.Phone; 
@Component("BasicPhone") 
public class BasicPhone implements Phone { 
    { 
     System.out.println("BasicPhone"); 
    } 

    public void openApp(int number) { 
     System.out.println("calling via simcard... " + number); 
    } 

} 

SmartPhone.java

package com.codegeekslab.type; 

import org.springframework.stereotype.Component; 
import org.springframework.stereotype.Service; 

import com.geekslab.device.Phone; 

@Component("SmartPhone") 
public class SmartPhone implements Phone { 
    { 
     System.out.println("SmartPhone"); 
    } 

    public void openApp(int number) { 
     System.out.println("calling via whatsapp..." + number); 
    } 

} 

Test.java

package com.codegeekslab.test; 

import org.springframework.context.annotation.AnnotationConfigApplicationContext; 

import com.codegeekslab.app.CallingApp; 
import com.codegeekslab.type.BasicPhone; 
import com.codegeekslab.type.SmartPhone; 
import com.geekslab.device.Phone; 

public class Test { 

    public static void main(String[] args) { 

     //ApplicationContext context = 
     //  new GenericXmlApplicationContext("beans.xml"); 
     //SpringHelloWorld helloSpring = context.getBean("springHelloWorld", SpringHelloWorld.class); 
     //comment this for xml less spring 
     AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); 
     context.scan("com.codegeekslab.app","com.codegeekslab.type"); 
     //context.register(BasicPhone.class,SmartPhone.class,CallingApp.class); 
     context.refresh(); 
     CallingApp callingApp = context.getBean("callingApp", CallingApp.class); 
     callingApp.makeCall(99999); 

    } 
} 

Даже если я даю спецификатор, как @Qualifier("BasicPhone") в CallingApp классе, я получаю исключение следующим образом:

Нет квалификационная боб типа [com.geekslab.device. Телефон]: ожидаемый одиночный бит, но найден 2: BasicPhone, SmartPhone

+0

Не могли бы вы удалить '@ComponentScan (basePackages = { "com.codegeekslab.type"})' от вашего класса сервиса, а затем попробовать ?? – SachinSarawgi

+0

@SachinSarawgi получил ответ, thnaks в любом случае – sdvadsa

ответ

5

Вы передаете телефон в качестве аргумента конструктора в своем CallingApp службы без указания компонента.

Попробуйте либо поставить квалификатор на свой конструктор, либо придерживаться автоматической установки, что уже есть у вас.

+1

вы правы thankx – sdvadsa

0

Я удалил конструктор класса CallingApp, и он сработал.

public CallingApp(Phone phone) { 
       this.phone = phone; 
      } 

Как конструктор перекрывал метод сеттера.

0

Вам нужно, чтобы добавить не аргумент конструктора

public CallingApp(){ 
    //do nothing 
} 
public CallingApp(Phone phone) { 
    this.phone = phone; 
} 

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

  • Нет связанных вопросов^_^