NoSuchBeanDefinitionException:没有定义类型的唯一bean。而两种相同类型的豆类

时间:2014-11-18 05:31:32

标签: java spring inversion-of-control autowired

这是我第一次使用@autowiring,我有一个例子。

我想使用 TYPE自动装配,因此在运行时容器注入适当的Object并调用适当的bean /方法。

1.INTERFACE

  public interface Calculator {

    public int add(int a,int b);
}

2.First Class

public class CalculatorImpl implements Calculator {

public int add(int a, int b) {
    // TODO Auto-generated method stub
    int result=a+b;

    return result;
}

}

3.Second Class

public class CalculatorImpl2 implements Calculator{

public int add(int a, int b) {
    // TODO Auto-generated method stub
    int result=a-b;

    return result;
}

}

4.REST CLASS

@Component
@Path("/calc")
    public class CalculationService {
    @Autowired
    Calculator calculator;

    @GET
    @Path("/add/{a}/{b}/")
@Qualifier("calculatorImpl")
    @Produces("text/plain")
    public Response serveAdd(@PathParam("a") int a,
            @PathParam("b") int b)
    {

        int result= calculator.add(a, b);

        return Response.status(200).entity(String.valueOf(result)).build();

    }


    @GET
    @Path("/sub/{a}/{b}")
@Qualifier("calculatorImpl2")
    public Response serveSub(@PathParam("a") int a,
            @PathParam("b") int b)
    {
        int result= calculator.add(a, b);

        return Response.status(200).entity(String.valueOf(result)).build();


    }
}

5.应用-context.xml中

<context:component-scan base-package="com.veke.rest" />

 <bean id="calculatorImpl" 
                  class="com.veke.calcImpl.CalculatorImpl"  autowire="byType"/>


  <bean id="calculatorImpl2" 
                  class="com.veke.calcImpl.CalculatorImpl2"  autowire="byType"/>

                  </beans>

错误:

  

org.springframework.beans.factory.BeanCreationException:错误   创建名为'calculationService'的bean:注入autowired   依赖失败;嵌套异常是   org.springframework.beans.factory.BeanCreationException:不能   autowire字段:com.veke.calc.Calculator   com.veke.rest.CalculationService.calculator;嵌套异常是   org.springframework.beans.factory。 NoSuchBeanDefinitionException:没有   [com.veke.calc.Calculator]类型的唯一bean定义为:expected   单个匹配的bean,但找到2:[calculatorImpl,calculatorImpl2]

我做过正确的事吗?或者我错了。

我通过对@autowiring的理解完成了这项工作。

非常感谢:)

编辑: @Qualifier是解决这个问题的方法。(因为我在上下文中有两个相同类型的bean)。 它用于解决歧义问题。 @Autowired 按类型

2 个答案:

答案 0 :(得分:3)

您不能只拥有一个Calculator实例变量,并使其同时表现为CalculatorImplCalculatorImpl2。您需要进行以下更改:

CalculationService

@Autowired
@Qualifier("Impl1")
Calculator calculator;

@Autowired
@Qualifier("Impl2")
Calculator calculator2;

然后您可以在相应的方法中使用这些实例变量。

答案 1 :(得分:0)

试试以下内容: 更改以下文件:

APPLICATION-CONTEXT.xml:

<context:component-scan base-package="com.veke.rest" />

 <bean name="Impl1" id="calculatorImpl" 
                  class="com.veke.calcImpl.CalculatorImpl"  autowire="byType"/>


  <bean name="Impl2" id="calculatorImpl2" 
                  class="com.veke.calcImpl.CalculatorImpl2"  autowire="byType"/>

                  </beans>

休息班:

@Component
@Path("/calc")
    public class CalculationService {
    @Autowired
    @Qualifier("Impl1"); //<-- qualifier used here.
    Calculator calculator;

    @Autowired
    @Qualifier("Impl2"); //<-- qualifier used here.
    Calculator calculator2;


    @GET
    @Path("/add/{a}/{b}/")
    @Produces("text/plain")
    public Response serveAdd(@PathParam("a") int a,
            @PathParam("b") int b)
    {

        int result= calculator.add(a, b);

        return Response.status(200).entity(String.valueOf(result)).build();

    }


    @GET
    @Path("/sub/{a}/{b}")
    public Response serveSub(@PathParam("a") int a,
            @PathParam("b") int b)
    {
        int result= calculator2.add(a, b);

        return Response.status(200).entity(String.valueOf(result)).build();


    }
}