定義一個布林屬性 private boolean isShowCode;,Eclipse 自動產生 Getter/Setter:
public boolean isShowCode() { return isShowCode; }
public void setShowCode(boolean isShowCode) { this.isShowCode = isShowCode; }
Spring 注入時拋出異常:
org.springframework.beans.NotWritablePropertyException:
Invalid property 'isShowCode' ... Did you mean 'showCode'?
Spring 內部透過 Introspector.getBeanInfo() 解析屬性。JDK 的 Introspector 依據 JavaBeans 規範 8.3 節 推導屬性名:
is<PropertyName>,則屬性名為 PropertyName(首字母小寫)。isShowCode(),推導出的屬性名為 showCode,而非 isShowCode。但開發者將欄位命名為 isShowCode,導致「欄位名」與「推導屬性名」不一致,Setter 又為 setShowCode,Spring 找不到 setIsShowCode,故報錯。
Eclipse 依規範為布林欄位產生 isXxx() Getter,但未去除欄位名中的 "is" 前綴。正確做法應為:
| 欄位名 | Getter | Setter | 推導屬性名 |
|---|---|---|---|
| showCode | isShowCode() / getShowCode() | setShowCode() | showCode ✅ |
| isShowCode | isIsShowCode() ❌ | setIsShowCode() | isShowCode ❌ |
userNamegetUserName() / setUserName()showCode(勿加 is)isShowCode() 或 getShowCode()setShowCode()getPName() / setPName()(首字母大寫)getpName() / setpName()(保持原樣)getXMLConfig() / setXMLConfig()(不變)showCode、enabled)。eBook → electronicBook)。「命名是給編譯器看的,更是給六個月後的自己看的。」—— 遵循規範,減少驚喜。