首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

Java Bean 布林屬性命名規範陷阱:isShowCode vs showCode

     編輯:J2EE

問題現場

定義布林屬性 private boolean isShowCode;,Eclipse 自動產生:

public boolean isShowCode() { return isShowCode; }
public void setShowCode(boolean isShowCode) { this.isShowCode = isShowCode; }

Spring 注入時拋出:NotWritablePropertyException: Invalid property 'isShowCode' ... Did you mean 'showCode'?

根因追蹤

  1. Spring 透過 Introspector.getBeanInfo() 取得屬性描述器。
  2. JavaBeans 規範 (8.3 節) 規定:布林屬性 <propertyName> 的讀取器可用 is<PropertyName>() 替代 get<PropertyName>()。
  3. 關鍵在於:屬性名稱推導規則會移除前綴 "is" 後的首字母大寫部分 作為屬性名。若欄位命名為 isShowCode,Introspector 推導出的屬性名為 showCode (去掉 "is" 並將 S 小寫)。
  4. 但 setter 名為 setShowCode (對應屬性 showCode),getter 為 isShowCode (對應屬性 showCode)。Spring 嘗試寫入 isShowCode (來自配置 <property name="isShowCode">),找不到對應 setter,故報錯。

JavaBeans 命名規則總結

屬性名模式範例GetterSetterIntrospector 推導屬性名
標準駝峰 (首字母小寫,第二單詞大寫)showCodegetShowCode() / isShowCode()setShowCode()showCode
布林屬性慣用 is 開頭 (不推薦)isShowCodeisIsShowCode() ❌setIsShowCode() ❌showCode (易混淆)
單字母開頭 (eBook, pName)pNamegetPName() / getpName() (Eclipse 版本差異)setPName() / setpName()pName / PName (版本差異)
雙大寫開頭 (XMLParser)XMLParsergetXMLParser()setXMLParser()XMLParser
首字母大寫 (PropertyName)PropertyNamegetPropertyName()setPropertyName()PropertyName (Spring 3.1 可工作,但違反 JSR)

最佳實踐建議

  1. 布林屬性勿用 "is" 開頭:改用 showCode、enabled、visible 等語意清晰名稱。
  2. 避免單字母開頭:eBook → electronicBook 或 ebook。
  3. 統一使用標準駝峰:首字母小寫,後續單詞大寫。
  4. IDE 版本差異:Eclipse 3.2 產生 getPName(),3.5+ 可能產生 getpName();建議手動確認或統一團隊 IDE 版本。
  5. Spring 配置屬性名必須與 Introspector 推導名一致:若欄位 showCode,配置 <property name="showCode">。

驗證測試

單元測試同時用原始 JavaBean 呼叫與 Spring 容器注入,確認兩種方式行為一致。

遵循命名規範,可避免反射/內省機制的誤判,減少莫名其妙的運行時錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved