2012-10-15 52 views
0

我正在學習Spring並編寫一個簡單的程序來將屬性注入到POJO中。下面是主類 -依賴性注入時的彈性錯誤

public class test { 
    public static void main (String[] args) { 
     ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); 
     MySpring sm = (MySpring)context.getBean("myspring"); 
     System.out.println(sm); 
    } 

} 

的POJO如下 -

public class MySpring { 
    public String count; 
    void setcount(String val){ 
     this.count = val; 
    } 
    String getcount(){ 
     return count; 
    } 

} 

而且配置文件是低於 -

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 
    <bean id="myspring" class="MySpring" > 
    <property name="count" value="PowerShell" /> 
    </bean> 
</beans> 

但是我收到以下錯誤,當我運行test.java類 -

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myspring' defined in class path resource [Beans.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'count' of bean class [MySpring]: Bean property 'count' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1396) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 
    at 
..... 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 
    at test.main(test.java:7) 
Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'count' of bean class [MySpring]: Bean property 'count' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? 
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1064) 
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:924) 

我知道這是一個常見的錯誤,但我無法找到根本原因,因爲一切似乎都很好。任何關於什麼可能是問題的指針是高度讚賞。

回答

0

Bean屬性 '計數' 不可寫無效或者和setter方法

你需要有一個設置爲count財產

+0

對不起,我的無知,但如果你看到我的POJO MySpring,我確實有一個setter的count屬性..void setcount(String val){this.count = val; } – user496934

+0

是否有任何需要遵守的具體慣例。 – user496934

+1

是的setter需要是公共的,約定是setCount(),第一個字符應該在CAP中。最好的是如果你使用IDE爲你創建setter。 – Anshu

0

setter方法應該是setCount(),不setcount()

0

的代碼void setcount(String val){應在上限更改爲 「C」

void setCount(String val) 

get/set後的起始字母應該在CAPS中。同樣適用於getter方法。

0

在命名setter/getters時,您需要遵循Javabeans命名約定。這是BeanIntrospection框架的一個要求。 下面應該工作:

void setCount(String val){ 
    this.count = val; 
} 

String getCount(){ 
    return count; 
} 
+0

參考:http://en.wikipedia.org/wiki/JavaBeans#JavaBean_conventions – ravz

0

我想,Spring嚴格按照bean的屬性注入的naming conventionProperties總是accessed via method calls on their owning object。對於readable屬性,將出現一個gettermethod來讀取值,對於writable屬性將有一個settermethod寫入那裏值。

你的情況 Spring's IOC container implementation ApplicationContext

所以嘗試實例化bean(MySpring)和你的MySpring類,這是count,爲injecting purpose container try to finding out the getCount() getter method inside your MySpring classinject財產,但你class內部沒有這樣的方法,其下降到Exception

改性你的bean

class MySpring 
{ 
    private String count; 

    /** 
    * @return the count 
    */ 
    public String getCount() { 
     return count; 
    } 

    /** 
    * @param count the count to set 
    */ 
    public void setCount(String count) { 
     this.count = count; 
    } 

} 
0

Spring IoC容器支持JavaBeans規範(http://www.oracle.com/technetwork/java/javase/documentation/spec-136004.html)所述設定器injectionas。

它搜索諸如「setCamelVarName()」之類的東西,並將方法名稱中「set」之後的第一個字母縮小並將方法名稱的其餘部分用作推導屬性名稱。 因此,要設置班級中的「count」屬性,您應該聲明一個公共方法public void setCount(int count)而不是public void setcount(int count)。無論如何,這最後一個也是不利於Java開發的。