※当サイトの記事には、広告・プロモーションが含まれます。

Eclipseのgetter/setterの自動生成でハマる。booleanには気を付けよう...

nazology.net

⇧ amazing...

Eclipseのgetter/setterの自動生成でハマる。booleanには気を付けよう...

久々にハマった...というか、Eclipseに裏切られた気分...無料で利用できるから文句は言えないけど...

いや、単に、「JSTLJSP 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のデータ型のフィールドに対して、頓珍漢なことをしてくれるという...

で、「JSTLJSP Standard Tag Library)」が悪いのか、Eclipseの自動生成されたgetter/setterで上述のようなデータ型booleanのフィールドのケースが悪いのか分からんのだけど、JSPのページを表示しようとするとエラーになる...

stackoverflow.com

⇧ 上記サイト様を参考にいろいろ試すも効果なし...

で、仕方ないので、

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にしてますが)、「JSTLJSP Standard Tag Library)」が認識してくれました。

ただ、

stackoverflow.com

stackoverflow.com

All the examples I've ever seen talk about boolean properties that allow getters of the form isProperty() in addition to getProperty() and never Booleans.

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

⇧ 結局のところ、「JSTLJSP Standard Tag Library)」の公式のドキュメントで言及があるわけではないらしく、人によって解釈が異なり過ぎていて真相は謎に包まれるばかり...

download.oracle.com

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/

⇧ ドットでフィールドにアクセスできるとは言ってるけども...

結局のところ、エラーになった原因はよく分からんかったけど、「JSTLJSP Standard Tag Library)」の問題なんかな?

Lombokとか使えるんであれば、Lombokとか使えば良い気もするけども。

Booleanを使っておけば、無難な気もする。

JSTLJSP Standard Tag Library)」を使っていないんであれば、特に気にする内容でもないのかも知らんけど。

Eclipse以外の「統合開発環境IDE:Integrated Development Environment)」だったら、こんなことに煩わされることないのかしら?

VS CodeVisual Studio Code)」って選択肢もあるか。

毎度モヤモヤ感が半端ない...

今回はこのへんで。