Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

Struts の ActionForm では2文字目が大文字の変数名を使えない

Struts では、内部で使っている Jakarta BeanUtils の制限で、ActionForm に2文字目が大文字の変数名(例えば「xPos」「yPos」とか)を使えない。
これは JavaBeans の仕様 *1 が原因。

  1. まず、先頭から2文字が大文字の変数名では、UpperCamelCase <-> lowerCamelCase の変換を行わない*2
  2. これに沿って、Introspector が getter/setter の名前から変数名を推測する*3
  3. すると、この推測の際に以下のような処理が行われる。
    1. 変数「xPos」の getter 「getXPos」が存在する。
    2. 「getXPos」から先頭の get を取って「XPos」
    3. これを decapitalize するが、先頭の2文字が大文字なのでそのまま「XPos」とする
    4. 「getXPos」に対応する変数の名前は「XPos」と推測される

というわけで、「xPos」という名前の変数を使っているはずが「XPos」という名前の変数を探しにいってしまうので問題が発生する。
回避方法は存在しない。Jakarta の Bugzilla にも Bug があったはずだが Bug # は失念……

  • Bug#23558だったが今は参照できない模様。

*1:以降 http://java.sun.com/products/javabeans/docs/spec.html の内容を参照

*2:8.8 Capitalization of inferred names

*3:p.74 Class Introspector のメソッド decapitalize の説明より