⇧ amazing...
Eclipseのgetter/setterの自動生成でハマる。booleanには気を付けよう...
久々にハマった...というか、Eclipseに裏切られた気分...無料で利用できるから文句は言えないけど...
いや、単に、「JSTL(JSP Standard Tag Library)」が空気を読まない子ってだけのかもしらんけど...
Eclipseで「Maven プロジェクト」とか作成しているとして、適当にクラスを作成します。
まぁ、適当に作成。
で、以下のようなフィールドを用意。
■/spring-mvc-jsp/src/main/java/com/dto/UserAccount.java
package com.dto; public class UserAccount { private String userId; private String pass; private int expireDate; private boolean isAvailable; }
で、Eclipseの便利機能である、「ソース(S)」>「getter および setter の生成(R)...」を選択し、
「すべて選択(A)」を押下しフィールドにチェックが付いたら、「生成」を押下。
getter/setter を自動生成してくれる。
package com.dto; public class UserAccount { private String userId; private String pass; private int expireDate; private boolean isAvailable; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public int getExpireDate() { return expireDate; } public void setExpireDate(int expireDate) { this.expireDate = expireDate; } public boolean isAvailable() { return isAvailable; } public void setAvailable(boolean isAvailable) { this.isAvailable = isAvailable; } }
⇧ getter/setterを自動生成してくれたのだけど、フィールドのデータ型がbooleanだと、getter/setterが上手く作ってくれないっぽい...
本来であれば、
■getterの命名
get + フィールド名(フィールド名の先頭は大文字)
■setterの命名
set + フィールド名(フィールド名の先頭は大文字)
となると思うのだけど、何故かは分からんのだけど、Eclipseの「getter および setter の生成(R)...」は、booleanのデータ型のフィールドに対して、頓珍漢なことをしてくれるという...
で、「JSTL(JSP Standard Tag Library)」が悪いのか、Eclipseの自動生成されたgetter/setterで上述のようなデータ型booleanのフィールドのケースが悪いのか分からんのだけど、JSPのページを表示しようとするとエラーになる...
⇧ 上記サイト様を参考にいろいろ試すも効果なし...
で、仕方ないので、
package com.dto; public class UserAccount { private String userId; private String pass; private int expireDate; private Boolean isAvailable; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public int getExpireDate() { return expireDate; } public void setExpireDate(int expireDate) { this.expireDate = expireDate; } public Boolean getIsAvailable() { return isAvailable; } public void setIsAvailable(Boolean isAvailable) { this.isAvailable = isAvailable; } }
のように、getter/setterの命名を直したところ(データ型もBooleanにしてますが)、「JSTL(JSP Standard Tag Library)」が認識してくれました。
ただ、
All the examples I've ever seen talk about boolean
properties that allow getters of the form isProperty()
in addition to getProperty()
and never Boolean
s.
I can't find any 'official' reference to this behaviour but this blog post seems to describe what I suspected when I commented initially - a Boolean
is an object while a boolean
is a primitive and while Java has auto-boxing, EL will ignore the isProperty()
getter that returns a Boolean
and will instead, look for a getProperty()
method.
So I suspect that, in your example, if you changed the return type of isValid()
to boolean
instead of Boolean
(but leave the type of the field as Boolean
), your EL expression will work as you expect.
https://stackoverflow.com/questions/5697589/cannot-read-boolean-property-in-jsp-el
⇧ 結局のところ、「JSTL(JSP Standard Tag Library)」の公式のドキュメントで言及があるわけではないらしく、人によって解釈が異なり過ぎていて真相は謎に包まれるばかり...
3.3 Nested Properties and Accessing Collections
The application data that a page author manipulates in a JSP page usually consists of objects that comply with the JavaBeans specification, or that represent collections such as lists, maps, or arrays.
The EL recognizes the importance of these data structures and provides two operators, “.” and “[]”, to make it easy to access the data encapsulated in these objects.
The "." operator can be used as a convenient shorthand for property access when the property name follows the conventions of Java identifiers. For example:
Dear ${user.firstName} from ${user.address.city}, thanks for visiting our website!
The “[]” operator allows for more generalized access, as shown below:
<%-- “productDir” is a Map object containing the description of products, “preferences” is a Map object containing the preferences of a user --%> product: ${productDir[product.custId]} shipping preference: ${user.preferences[“shipping”]}
https://download.oracle.com/otndocs/jcp/jstl-1.1-mr2-spec-oth-JSpec/
⇧ ドットでフィールドにアクセスできるとは言ってるけども...
結局のところ、エラーになった原因はよく分からんかったけど、「JSTL(JSP Standard Tag Library)」の問題なんかな?
Lombokとか使えるんであれば、Lombokとか使えば良い気もするけども。
Booleanを使っておけば、無難な気もする。
「JSTL(JSP Standard Tag Library)」を使っていないんであれば、特に気にする内容でもないのかも知らんけど。
Eclipse以外の「統合開発環境(IDE:Integrated Development Environment)」だったら、こんなことに煩わされることないのかしら?
「VS Code(Visual Studio Code)」って選択肢もあるか。
毎度モヤモヤ感が半端ない...
今回はこのへんで。