解決當boolean類型的變量命名由is開頭時,IDEA自動生成get、set方法的問題
一、背景
阿里巴巴Java開發手冊中對POJO類中布爾類型的變量命名有明確規定
【強制】 POJO 類中布爾類型變量都不要加 is 前綴,否則部分框架解析會引起序列化錯誤。
說明: 在本文 MySQL 規約中的建表約定第一條,表達是與否的值采用 is_xxx 的命名方式,所以,需要在
<resultMap>設置從 is_xxx 到 xxx 的映射關系。
反例: 定義為基本數據類型 Boolean isDeleted 的屬性,它的方法也是 isDeleted(), RPC 框架在反向解
析的時候, “誤以為” 對應的屬性名稱是 deleted,導致屬性獲取不到,進而拋出異常。
主要原因就是在部分框架中這種命名方式會導致部分框架解析錯誤,但是當我們遇到老系統中已經存在大量不規范的命名時,該如何解決呢?
二、現象
當我們在一個類中定義了Boolean或者boolean類型的變量,並且命名時使用is
開頭
public class TestVO {
private Boolean isEnable = false;
private boolean isDelete = false;
}
當我們使用IDEA默認的配置生成get、set方法(快捷鍵:alt+insert)
會得到
public class TestVO {
private Boolean isEnable = false;
private boolean isDelete = false;
public Boolean getEnable() {
return isEnable;
}
public void setEnable(Boolean enable) {
isEnable = enable;
}
public boolean isDelete() {
return isDelete;
}
public void setDelete(boolean delete) {
isDelete = delete;
}
}
我們發現,當變量為Boolean類型時,生成的get、set方法會自動去掉is;當變量為boolean時,get方法變為了
isDelete,set方法自動去掉is。這會導致部分框架在解析的時候報錯。
三、解決辦法
修改IDEA生成get、set方法的模板,將上述情況下的變量生成時不忽略is。先用快捷鍵alt+insert打開菜單,點擊Getter and Setter
然后點擊Getter template
和Setter template
后面的按鈕,增加自定義模板
自定義Getter template為:
#set($paramName = $helper.getParamName($field, $project))
#if($field.modifierStatic)
static ##
#end
$field.type ##
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($field.name == $paramName)
get##
#else
getIs##
#end
${name}() {
return this.##
$field.name;
}
自定義Setter template為:
#set($paramName = $helper.getParamName($field, $project))
#if($field.modifierStatic)
static ##
#end
void ##
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($field.name == $paramName)
set##
#else
setIs##
#end
${name}($field.type $paramName) {
#if (!$field.modifierStatic)
this.##
#else
$classname.##
#end
$field.name = $paramName;
}
點擊+
號新增即可,Setter template也是一樣的操作
添加完成后,生成get、set方法時,使用自定義模板即可
得到結果為:
public class TestVO {
private Boolean isEnable = false;
private boolean isDelete = false;
public Boolean getIsEnable() {
return this.isEnable;
}
public void setIsEnable(Boolean enable) {
this.isEnable = enable;
}
public boolean getIsDelete() {
return this.isDelete;
}
public void setIsDelete(boolean delete) {
this.isDelete = delete;
}
}