1

我有一个扩展属性的类,用于存储一些专门的键名:

public class StorageConfiguration extends Properties {
    private final String PROPERTY_NAME_1 = "property.key";

    public String getProperty1() {
        return this.getProperty(PROPERTY_NAME_1);
    }

    public void setProperty1(String property1) {
        this.setProperty(PROPERTY_NAME_1, property1);
    }
}

还有一个使用这些属性的类:

public class Storage {
    StorageConfiguration storageConfiguration;

    @Autowired
    public void setStorageConfiguration(StorageConfiguration storageConfiguration) {
        this.storageConfiguration = storageConfiguration;
    }

    public void init() {
        // Initialize properties in this class using StorageConfiguration.
    }
}

我将 Spring 设置为初始化 Storage 和 StorageConfiguration ,如下所示:

<bean id="storage" class="com.k4rthik.labs.Storage" init-method="init">
    <property name="storageConfiguration" ref="storageConfiguration" />
</bean>
<bean id="storageConfiguration"
      class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="storageConfiguration">
        <props>
            <prop key="property.key">property_value</prop>
        </props>
    </property>
</bean>

我预期会发生的是 Spring 会通过将属性“property.key”设置为“property_value”来初始化 StorageConfiguration 对象。

但是我得到以下异常

org.springframework.beans.factory.BeanCreationException:创建在类路径资源[applicationContext.xml]中定义的名称为“storage”的bean时出错:在设置bean属性“authorizationConfig”时无法解析对bean“storageConfiguration”的引用;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建类路径资源 [applicationContext.xml] 中定义的名称为“authorizationConfig”的 bean 时出错:设置属性值时出错;嵌套异常是 org.springframework.beans.NotWritablePropertyException:bean 类 [org.springframework.beans.factory.config.PropertiesFactoryBean] 的属性“storageConfiguration”无效:Bean 属性“storageConfiguration”不可写或设置方法无效。

如您所见,我在 Storage 类中有一个用于 storageConfiguration 的自动装配设置器,所以我真的看不出这里有什么问题。

4

2 回答 2

4

PropertiesFactoryBean 创建一个 Properties 类型的 bean。

要创建 StorageConfiguration,您可以创建一个 Copy 构造函数

public class StorageConfiguration
{
    public StorageConfiguration(Properties defaults) {
        super(defaults);
    }
}

那么这应该工作:

<bean id="storageConfiguration" class="..StorageConfiguration">
  <constructor-arg>

   <bean class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="properties">
        <props>
            <prop key="property.key">property_value</prop>
        </props>
    </property>
  <bean>
  </constructor-arg>
</bean>

甚至:

<bean id="storageConfiguration" class="..StorageConfiguration">
  <constructor-arg>   
        <props>
            <prop key="property.key">property_value</prop>
        </props>
  </constructor-arg>
</bean>
于 2013-05-28T12:57:54.290 回答
3

它应该是

<bean id="storage" class="com.k4rthik.labs.Storage" init-method="init">
    <property name="storageConfiguration">
         <props>
            <prop key="property.key">property_value</prop>
        </props>
    </property>
</bean>

配置

<bean id="storageConfiguration"
      class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="storageConfiguration">
        <props>
            <prop key="property.key">property_value</prop>
        </props>
    </property>
</bean>

意味着StorageConfigurationtypeorg.springframework.beans.factory.config.PropertiesFactoryBean有一个名为 的属性storageConfiguration,根据您的代码,它看起来不像

于 2013-05-28T12:56:57.453 回答