You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring中Setter注入第二个属性时出现非法Setter方法异常的解决方法

解决Spring Setter注入多属性时的非法Setter方法异常

问题场景

在Spring中尝试为BaseBallGame类通过Setter注入两个依赖(IDependency和IDependencySecond),仅注入第一个依赖时程序运行正常,但添加第二个依赖的注入配置后,抛出illegal dependencySecond setter method exception异常。

相关代码如下:

IDependency.java

public interface IDependency {
    public void printDependency();
}

IDependencySecond.java

public interface IDependencySecond {
    public void printSecondDependency();
}

Dependency.java

public class Dependency implements IDependency {
    Dependency() {
        System.out.println("Inside dependency constructor");
    }

    @Override
    public void printDependency() {
        System.out.println("I am dependency");
    }
}

DependencySecond.java

public class DependencySecond implements IDependencySecond {
    DependencySecond() {
        System.out.println("Inside second dependency constructor");
    }
    
    @Override
    public void printSecondDependency() {
        System.out.println("I am second depedency");
    }
}

IGame.java

public interface IGame {
    public void printDependency();
    public void playGame();
}

BaseBallGame.java

public class BaseBallGame implements IGame {
    private IDependency dependency;
    private IDependencySecond dependencySecond;

    BaseBallGame(){
        System.out.println("Inside baseball game constructor");
    }
    
    public void setDependency(IDependency dependency) {
        this.dependency = dependency;
    }
    
    public void setDependencySecond(IDependencySecond dependencySecond) {
        this.dependencySecond = dependencySecond;
    }

    @Override
    public void printDependency() {
        dependency.printDependency();
    }

    @Override
    public void playGame() {
        System.out.println("Playing baseball");
    }
}

初始正常的Spring配置(仅注入第一个依赖)

<bean   id="dependency"
        class="com.lonelychild.springdemo.Dependency">
</bean>

<bean   id="dependency2"
        class="com.lonelychild.springdemo.DependencySecond">
</bean>

<bean   id="game"
        class="com.lonelychild.springdemo.BaseBallGame">
    <property name="dependency" ref="dependency"></property>
</bean>

主类代码

ClassPathXmlApplicationContext context = 
        new ClassPathXmlApplicationContext("applicationContext.xml");

IGame game = context.getBean("game", IGame.class);

game.printDependency();
game.playGame();

context.close();

引发异常的配置(添加第二个依赖注入)

<bean   id="game"
        class="com.lonelychild.springdemo.BaseBallGame">
    <property name="dependency" ref="dependency"></property>
    <property name="dependency2" ref="dependency2"></property>
</bean>

错误原因

Spring处理<property>标签时,会根据name属性值匹配对应的Setter方法:它会把name的首字母大写,前缀加上set来查找方法。例如name="dependency"会匹配setDependency方法,但配置中的name="dependency2"会让Spring去查找setDependency2方法,而BaseBallGame类中实际对应的Setter是setDependencySecond,因此找不到对应方法,抛出异常。

解决方案

将第二个<property>标签的name属性改为dependencySecond,与BaseBallGame类中的属性名和Setter方法对应。修改后的配置如下:

<bean   id="game"
        class="com.lonelychild.springdemo.BaseBallGame">
    <property name="dependency" ref="dependency"></property>
    <property name="dependencySecond" ref="dependency2"></property>
</bean>

这样Spring就能正确找到setDependencySecond方法,完成第二个依赖的Setter注入。

内容的提问来源于stack exchange,提问作者Payel Senapati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 07:45:33