我正在尝试使用protected
机制在注释配置的bean中设置String
property-override
字段的值。除非我为bean中的字段添加setter,否则它会抛出异常。
org.springframework.beans.NotWritablePropertyException: Invalid property 'cookie' of bean class [com.test.TestBean]: Bean property 'cookie' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
要比较我还有另一个protected
字段,它是另一个类的类型。另一个类的Bean是用XML定义的。该字段可以正确自动装配。
这是第一个豆
@Component("testBean")
public class TestBean {
protected @Autowired(required=false) String cookie;
protected @Autowired InnerBean innerBean;
public String getCookie() {
return cookie;
}
public void setCookie(String cookie) {
this.cookie = cookie;
}
public InnerBean getInnerBean() {
return innerBean;
}
}
这是InnerBean
public class InnerBean {
private String value;
public void setValue(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
Spring配置文件 - 只有有趣的位
<context:property-override location="beans.properties"/>
<context:component-scan base-package="com.test"></context:component-scan>
<context:annotation-config></context:annotation-config>
<bean id="innerBean" class="com.test.InnerBean">
<property name="value">
<value>Inner bean</value>
</property>
</bean>
beans.properties
testBean.cookie=Hello Injected World
主要
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("test.xml");
TestBean bean = context.getBean(TestBean.class);
System.out.println("Cookie : " + bean.getCookie());
System.out.println("Inner bean value : " + bean.getInnerBean().getValue());
}
输出
Cookie : Hello Injected World
Inner bean value : Inner bean
如果我只是在cookie
中注释掉TestBean
的setter,我会得到提到的NotWritablePropertyException
异常。自动装配bean和自动装配属性之间有区别吗?
答案 0 :(得分:1)
@Autowired
只应在您想将Spring bean连接到另一个bean时使用。
属性由PropertyOverrideConfigurer
设置,这是与自动装配不同的过程,并且不使用@Autowired
注释。 @Autowired
属性上的cookie
注释是不必要的,可能会混淆Spring的bean工厂。我希望只需删除注释即可解决问题,即:
protected String cookie;
protected @Autowired InnerBean innerBean;
即使属性是私有的或受保护的,Spring也能够设置属性。