在開發的過程中,實體之間相互賦值是很正常的事,但是我們一般的方法都通過set和get方法來進行的,如果要賦值的字段少那還行,但是需要賦值的字段超過10個,那就是個災難,你會看到整屏代碼中全是set和get方法。
- 兩個實體屬性字段幾乎完全相同
- 兩個字體有部分字段相同
- 源實體只有部分字段賦值,目標實體有完整的值
第一種情況
對于第1點來說,我們用到最多的就是entity和dto之間的轉換了,這個我們可以使用spring的工具類beanutils來解決,這里要注意的一點是,==第一個參數是源,第二個參數是目標==。
1
2
|
import org.springframework.beans.beanutils; beanutils.copyproperties(origin, target); |
第二種情況
但是對于第2點來說,就沒有那么簡單了,再使用beanutils已經不能滿足我們的需要了。
我們可以使用jackson的objectmapper
1
2
3
4
5
6
7
8
9
10
11
|
import com.fasterxml.jackson.databind.deserializationfeature; import com.fasterxml.jackson.databind.objectmapper; import com.fasterxml.jackson.databind.objectreader; import com.jd.fastjson.json; objectmapper objectmapper = new objectmapper(); //配置該objectmapper在反序列化時,忽略目標對象沒有的屬性。凡是使用該objectmapper反序列化時,都會擁有該特性。 objectmapper.configure(deserializationfeature.fail_on_unknown_properties, false ); //讀入需要更新的目標實體 objectreader objectreader = objectmapper.readerforupdating(target); //將源實體的值賦值到目標實體上 objectreader.readvalue(json.tojsonstring(source)); |
我們總結一下objectmapper的過濾參數:
1
2
3
4
5
6
7
8
9
10
|
/* 通過該方法對mapper對象進行設置,所有序列化的對象都將按改規則進行系列化 include.include.always 默認 include.non_default 屬性為默認值不序列化 include.non_empty 屬性為 空(“”) 或者為 null 都不序列化 include.non_null 屬性為null 不序列化 */ objectmapper.setserializationinclusion(jsoninclude.include.non_default); string outjson = objectmapper.writevalueasstring(productdetail); //上面代碼里,outjson的值將會過濾掉只有默認值的屬性 |
第三種情況
本情況主要對于從dto到entity轉換過程中出現 ,比如一個put操作,前端可能只修改某幾個屬性,而在后端處理時也只希望處理這幾個被賦值的屬性,這時我們使用下面的方法:
1
2
3
4
5
6
7
8
9
10
11
|
@requestmapping (value = "/{id}" , method = requestmethod.put) public httpentity update( @pathvariable int id, @requestbody productdetail productdetail) throws ioexception { productdetail existing = repository.findbyid(id).get(); objectmapper.setserializationinclusion(jsoninclude.include.non_default); string outjson = objectmapper.writevalueasstring(productdetail); objectreader objectreader = objectmapper.readerforupdating(existing); objectreader.readvalue(outjson); repository.save(existing); return new responseentity<>(existing, httpstatus.accepted); } |
通過objectmapper的使用,確實讓我們少寫很多重復的代碼。
總結
以上所述是小編給大家介紹的springboot~objectmapper~dto到entity的自動賦值,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:https://www.cnblogs.com/lori/archive/2018/08/01/9400510.html