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
相关产品推荐
相关产品推荐

