0

我正在尝试使用机制protected String在注释配置的 bean 中设置字段的值。property-override除非我为 bean 中的字段添加设置器,否则它会引发以下异常。

 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>

bean.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

如果我只是注释掉 in 的设置器cookieTestBean我会得到提到的NotWritablePropertyException异常。自动装配 bean 和自动装配属性之间有区别吗?

4

1 回答 1

1

@Autowired只有当你想将一个 Spring bean 连接到另一个 bean 时才应该使用。

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

protected String cookie;
protected @Autowired InnerBean innerBean;

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

于 2012-08-16T08:27:44.647 回答