@Data注解在Boolean類型屬性上的大坑及解決
@Data注解在Boolean類型屬性上的大坑
直接看總結(jié)吧
問題描述
將A類的值拷貝到B類,且A類中多余的屬性存放到B類的extraElement屬性中;
發(fā)現(xiàn)問題:Boolean屬性的字段沒有完成拷貝
具體描述信息
- 類A:
@Data
public class A {
private String id;
private String name;
private boolean sex;
}- 類B:
@Data
public class B {
private String id;
private String extraElement;
}拷貝的代碼
public static void main(String[] args) {
A a = new A();
a.setId(Pub.getUUID());
a.setSex(true);
a.setName("test");
B b = new B();
ToolBeans.copyPropertiesToExtra( a, b, "extraElement" );
System.out.println(a);
System.out.println(b);
System.out.println(b.getExtraElement());
}
public static <F, T> void copyPropertiesToExtra( F from, T to, String extra )
{
MethodAccess fromMethodAccess = get( from.getClass() );
MethodAccess toMethodAccess = get( to.getClass() );
Field[] fromDeclaredFields = from.getClass().getDeclaredFields(); // 獲取來源的字段
JSONObject extraJson = new JSONObject();
for ( Field field : fromDeclaredFields )
{
String name = field.getName();
Object value = null;
try
{
value = fromMethodAccess.invoke( from, "get" + StringUtils.capitalize( name ), null );
toMethodAccess.invoke( to, "set" + StringUtils.capitalize( name ), value );
}
catch ( Exception e )
{
// 設(shè)置異常,可能會(huì)沒有對(duì)應(yīng)字段,忽略
extraJson.put( name, value );
}
}
try
{
toMethodAccess.invoke( to, "set" + StringUtils.capitalize( extra ), extraJson.toJSONString() );
}
catch ( Exception e )
{
log.error( "將數(shù)據(jù)放置到擴(kuò)展字段失敗", e );
}
}
結(jié)果

可以明顯看到id屬性已經(jīng)拷貝成功,多余的屬性name和sex name已經(jīng)進(jìn)入了extraElement中,唯獨(dú)sex沒有拷貝成功
發(fā)現(xiàn)原因
通過追源碼后發(fā)現(xiàn)

對(duì)于Boolean類型的數(shù)據(jù), @Data給到的get方法名默認(rèn)為isSex而不是getSex
問題解決
手動(dòng)添加get方法,覆蓋掉@Data注解的方法

再次運(yùn)行:

問題解決!
問題總結(jié)
添加@Data注解時(shí), 如果有boolean屬性的數(shù)據(jù),且屬性的名字還不是is開頭的,則默認(rèn)的get方法就會(huì)把is給加上
場(chǎng)景1
boolean sex;
在加上@Data注解后得到的get set方法為

set方法正常但get方法是 isSex() 而不是 getSex()
場(chǎng)景2
如果已經(jīng)有了is則就是正常形式了:
boolean isGirl;
在加上@Data注解后得到的get,set方法為

- get方法為isGirl() 而不是getIsGirl()
- set方法為setGirl 而不是setIsGirl()
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)動(dòng)態(tài)驗(yàn)證碼生成
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)動(dòng)態(tài)驗(yàn)證碼生成,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
MyBatis注解實(shí)現(xiàn)動(dòng)態(tài)SQL問題
這篇文章主要介紹了MyBatis注解實(shí)現(xiàn)動(dòng)態(tài)SQL問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
用Java實(shí)現(xiàn)簡(jiǎn)單畫板功能
這篇文章主要為大家詳細(xì)介紹了用Java實(shí)現(xiàn)簡(jiǎn)單畫板功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
Spring MVC如何設(shè)置請(qǐng)求頭和響應(yīng)頭的Header
這篇文章主要介紹了Spring MVC如何設(shè)置請(qǐng)求頭和響應(yīng)頭的Header問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
SpringBoot如何使用applicationContext.xml配置文件
這篇文章主要介紹了SpringBoot使用applicationContext.xml配置文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Spring Boot Controller處理HTTP請(qǐng)求體的方法
Spring Boot提供了強(qiáng)大的機(jī)制來處理不同 Content-Type? 的HTTP請(qǐng)求體,這主要依賴于 HttpMessageConverter? 接口的各種實(shí)現(xiàn),它們能夠自動(dòng)將請(qǐng)求體內(nèi)容轉(zhuǎn)換成Java方法參數(shù),本文給大家介紹Spring Boot Controller處理HTTP請(qǐng)求體的方法,感興趣的朋友一起看看吧2025-05-05
詳解java開啟異步線程的幾種方法(@Async,AsyncManager,線程池)
在springboot框架中,可以使用注解簡(jiǎn)單實(shí)現(xiàn)線程的操作,還有AsyncManager的方式,如果需要復(fù)雜的線程操作,可以使用線程池實(shí)現(xiàn),本文通過實(shí)例代碼介紹java開啟異步線程的幾種方法(@Async,AsyncManager,線程池),感興趣的朋友一起看看吧2023-09-09
Java Volatile關(guān)鍵字實(shí)現(xiàn)原理過程解析
這篇文章主要介紹了Java Volatile關(guān)鍵字實(shí)現(xiàn)原理過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03

