我已成功为除java.util.Properties实例之外的所有内容配置了Spring自动装配。
当我使用注释自动装配其他所有内容时:
@Autowired private SomeObject someObject;
它运作得很好。
但是当我尝试这个时:
@Autowired private Properties messages;
使用此配置:
<bean id="mybean" class="com.foo.MyBean" >
<property name="messages">
<util:properties location="classpath:messages.properties"/>
</property>
</bean>
我收到错误(仅限相关行):
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mybean' defined in class path resource [application.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'messages' of bean class [com.foo.MyBean]: Bean property 'messages' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
Wheras,如果我用一种老式的setter方法尝试它,Spring非常高兴地连接它:
public void setMessages(Properties p) { //this works
this.messages = p;
}
尝试自动装配属性对象时,我做错了什么?
答案 0 :(得分:8)
看起来你正试图在第一种情况下调用setter方法。在bean元素中创建一个property元素时,它将使用setter注入来注入bean。 (你的情况下没有一个setter,所以它会抛出一个错误)
如果你想要自动装配它,请删除它:
<property name="messages">
<util:properties location="classpath:messages.properties"/>
</property>
从bean定义中,这将尝试调用setMessages
方法。
而是简单地将上下文文件中的属性bean分别定义到MyBean
:
<bean id="mybean" class="com.foo.MyBean" />
<util:properties location="classpath:messages.properties"/>
然后应该正确地自动装配。
请注意,这也意味着您可以将此@Autowired private Properties messages;
添加到任何Spring托管bean,以便在其他类中使用相同的属性对象。