首页 > 解决方案 > Spring:UnsatisfiedDependencyException 即使限定符属性匹配

问题描述

摘要:我正在使用一些示例 Spring 代码(来自 javabrains.io)。基本上,这段代码说明了@QualifierJava 文件中注解的使用。bean 元素之一 (in spring.xml) 具有与@Qualifier注释的值匹配的限定符,但即便如此,也会UnsatisfiedDependencyException被抛出。


详细信息:该类Circle有一个接受Point对象并具有以下注释的方法:

@Autowired
@Qualifier("circleRelated")  

我们spring.xml有三个 Point bean pointApointBpointCpointA将 property 属性设置为circleRelated. 可以预期,由于该 bean 符合限定符标准(即 value = "circleRelated"),因此在初始化时自动装配应该顺利完成。然而,UnsatisfiedDependencyException被抛出。源代码如下:


Point.java

package org.koushik.javabrains;

public class Point {
    private int x;
    private int y;

    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
}

Circle.java

package org.koushik.javabrains;

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

public class Circle {
    private Point center;

    public Point getCenter() {
        return center;
    }

    @Autowired
    @Qualifier("circleRelated")
    public void setCenter(Point center) {
        this.center = center;
    }


    public void draw() {
        System.out.println("Drawing Circle");
        System.out.println("Circle: Center point is: " + center.getX() + ", " + center.getY());
    }

}

绘图应用程序.java

package org.koushik.javabrains;

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

public class DrawingApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

        Circle circle = (Circle) context.getBean("circle");
        circle.draw();
    }
}

春天.xml

<?xml version="1.0" encoding="UTF-8"?>
<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 https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"
    xmlns:context="http://www.springframework.org/schema/context">

    <bean id="pointA" class="org.koushik.javabrains.Point">
        <qualifier value="circleRelated"/>
        <property name="x" value ="0"/>
        <property name="y" value ="0"/>
    </bean>

    <bean id="pointB" class="org.koushik.javabrains.Point">
        <property name="x" value ="-20"/>
        <property name="y" value ="0"/>
    </bean>

    <bean id="pointC" class="org.koushik.javabrains.Point">
        <property name="x" value ="20"/>
        <property name="y" value ="0"/>
    </bean>

    <bean id="circle" class="org.koushik.javabrains.Circle">
    </bean>

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

</beans>

标签: spring

解决方案


你不见了

<context:annotation-config/>

在你的 spring.xml 中标记

来源

使用这些注解还需要在 Spring 容器中注册某些 BeanPostProcessor。与往常一样,这些可以注册为单独的 bean 定义,但它们也可以通过在基于 XML 的 Spring 配置中包含以下标记来隐式注册(注意包含“上下文”命名空间):

附带说明一下,您使用基于 xml 的配置的任何具体原因?虽然 spring 支持 xml 配置,但人们已经很久没有转向基于注解的配置了。我建议值得探索基于注解的路由。


推荐阅读