当前位置: 首页 > 知识库问答 >
问题:

Spring@Qualifier注释不工作

慕凌
2023-03-14

我在玩@Qualifier@Autowired
这是我的应用程序上下文文件

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />

<bean id="helloBean" class="com.springex1.HelloWorld1">
    <property name="name" value="Mkyong" />
</bean>

<bean id="address1" class="com.springex1.Address" >
    <property name="street" value="sahajanand" />
</bean>

<bean id="address2" class="com.springex1.Address" >
    <property name="street" value="pune" />
</bean>

以下是我的Java类
HelloWorld1。JAVA

package com.springex1;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class HelloWorld1 {
private String name;

@Autowired
@Qualifier("address1")
private Address address = null; 

public void setName(String name) {
    this.name = name;
}


public void setAddress(Address address) {
    this.address = address;
}

public void printHelloWithAddress() {
    System.out.println("Hello ! " + name + " your street " + address.getStreet());
}


}

住址JAVA

package com.springex1;

public class Address {
private String street = "";

public void setStreet(String street) {
    this.street = street;
}

public String getStreet(){
    return this.street;
}
}

这里是我尝试运行东西的地方-应用程序。JAVA

package com.springex1;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {

public static void main(String[] args) {

    call1("appContext1.xml");           
}

public static void call1(String appContext){
    ApplicationContext context = new ClassPathXmlApplicationContext(appContext);

    HelloWorld1 obj = (HelloWorld1) context.getBean("helloBean");
    obj.printHelloWithAddress();
}     
} 

我一直在得到这个异常-理想情况下我不应该,因为我已经定义了id为'address1'的@Qualifier注释-所以它不应该抛出异常

警告:上下文初始化过程中遇到的异常-取消刷新尝试:org.springframework.beans.factory.未满足依赖异常:创建名为“helloBean”的bean时出错:通过字段“地址”表示的不满足依赖关系:没有类型[com.springex1的限定bean。地址]被定义为:预期的单个匹配bean,但发现2: address1,address2;嵌套异常是org.springframework.beans.factory.NoUniqueBean定义异常:没有类型[com.springex1的合格bean。地址]被定义:预期的单个匹配bean,但发现2: address1,address2异常在线程“main”org.springframework.beans.factory.不满意依赖异常:错误创建bean的名称'helloBean':不满意的依赖通过字段'地址'表示:没有符合条件的bean的类型[com.springex1...地址]被定义为:预期的单个匹配bean,但发现2: address1,address2;嵌套异常是org.springframework.beans.factory.NoUniqueBean定义异常:没有类型[com.springex1的合格bean。地址]被定义为:预期的单个匹配bean,但发现2: address1,address2在org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPost处理器$autowiredFieldElement.inject(autowiredAnnotationBeanPostProcessor.java:573)

我使用的是Spring4.3发行版-这是我pom中唯一的依赖项

    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.0.RELEASE</version>
</dependency>
<!-- 
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.3.0.RELEASE</version>
</dependency>
 -->

共有3个答案

钮博裕
2023-03-14

Spring4。x使用以下bean模式

<beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

您还需要添加:

<context:annotation-config /> 

或:

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

通过添加其中一个标记,可以从xml中删除AutowiredNotationBeanPostProcessor定义。

欧阳英彦
2023-03-14

您需要添加

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:annotation-config />

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />

<bean id="helloBean" class="com.code.samples.HelloWorld1">
    <property name="name" value="Mkyong" />
</bean>

<bean id="address1" class="com.code.samples.Address" >
    <property name="street" value="sahajanand" />
</bean>

<bean id="address2" class="com.code.samples.Address" >
    <property name="street" value="pune" />
</bean>
</beans>

景星光
2023-03-14

首先,Spring文档建议不要使用@Qualifer,而是建议使用@Resources注释,该注释按名称进行注入(如限定符)。

因此,选项一是将@限定符替换为@Resource注释。

但是为了使IOC能够正确地使用@Resource进行注入,您应该

名称地址地址地址地址1

现在,如果仍要使用@限定符,则必须将配置更改为:

<bean id="address1" class="com.springex1.Address" >
    <property name="street" value="sahajanand" />
    <qualifier value="address1"/>
</bean>
 类似资料:
  • 我有3个数据源,我设置如下: 我正在尝试将它们自动加入到我的消费者阶层中,如下所示:

  • 我将Spring 3.2.4与JavaFX结合使用,并希望实现一种方法,其中操作将在事务中执行。我在控制器中的代码如下所示: 以及我的应用程序上下文: 尝试运行时,我收到以下错误消息: 该方法存在。删除注释,或者将方法从public更改为private,或者从配置中删除bean,程序就会运行,但事务注释根本不起作用。删除代理目标会导致另一个错误。

  • 我的spring应用程序有点小问题。下面是我的代码: (存储库) 下面是我的简单服务类: 更新:配置

  • 我正在为我的Spring Boot应用程序配置OAuth2。我找到了一个解释它的链接https://gigsterous.github.io/engineering/2017/03/01/spring-boot-4.html. 这是我的OAuth2Config文件: 这是我的appUSerService文件: 但是我得到了这个错误:这一行有多个标记——这个位置不允许使用注释@限定符——注释类型限定

  • 我想允许一个域的跨源请求。我的项目使用Spring,所以我想利用新的CORS支持。 我遵循下面的示例https://spring.io/blog/2015/06/08/cors-support-in-spring-framework#disqus_thread并尝试了第一个版本。我的控制器注释如下所示: 如果我理解正确的话,mvc-config是一种替代方法。我也试过了: 对于这两种方法,响应似乎

  • 因此,我试图在IntelliJ中使用项目配置设置中的spring选项启动一个新的web项目,但当我最终获得项目设置时,似乎我创建的任何新控制器都被忽略了,即使我对它们进行了注释。@RequestMapping似乎从未被映射。我所能访问的只是位于web目录根目录中的文件。 在无法使其工作之后,我切换到Gradle,以便可以导入一些额外的库来测试我的项目。我的gradle文件如下所示: 是否有某种配置