0

メカニズムprotected Stringを使用して、アノテーション構成の Bean にフィールドの値を設定しようとしています。property-overrideBean のフィールドにセッターを追加しない限り、次の例外がスローされます。

 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>

ビーンズのプロパティ

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

cookieinのセッターをコメントアウトするだけでTestBean、前述のNotWritablePropertyException例外が発生します。Bean の自動配線とプロパティの自動配線に違いはありますか?

4

1 に答える 1

1

@AutowiredSpring Bean を別の Bean に接続する場合にのみ使用してください。

プロパティは、オートワイヤリングとは別のプロセスで設定され、アノテーションPropertyOverrideConfigurerを使用しません。@Autowiredプロパティのその@Autowired注釈cookieは不要であり、Spring の Bean ファクトリを混乱させる可能性があります。注釈を削除するだけで問題が解決するはずです。つまり、次のようになります。

protected String cookie;
protected @Autowired InnerBean innerBean;

Spring は、プライベートまたは保護されている場合でも、プロパティを設定できます。

于 2012-08-16T08:27:44.647 に答える