为什么String类型的受保护字段不能获得自动装配,而其他bean也可以

时间:2012-08-16 07:37:21

标签: spring

我正在尝试使用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和自动装配属性之间有区别吗?

1 个答案:

答案 0 :(得分:1)

@Autowired只应在您想将Spring bean连接到另一个bean时使用。

属性由PropertyOverrideConfigurer设置,这是与自动装配不同的过程,并且不使用@Autowired注释。 @Autowired属性上的cookie注释是不必要的,可能会混淆Spring的bean工厂。我希望只需删除注释即可解决问题,即:

protected String cookie;
protected @Autowired InnerBean innerBean;

即使属性是私有的或受保护的,Spring也能够设置属性。