springboot~ObjectMapper~dto到entity的自動賦值
實(shí)體與Dto自動賦值
在開發(fā)的過程中,實(shí)體之間相互賦值是很正常的事,但是我們一般的方法都通過set和get方法來進(jìn)行的,如果要賦值的字段少那還行,但是需要賦值的字段超過10個,那就是個災(zāi)難,你會看到整屏代碼中全是set和get方法。
- 兩個實(shí)體屬性字段幾乎完全相同
- 兩個字體有部分字段相同
- 源實(shí)體只有部分字段賦值,目標(biāo)實(shí)體有完整的值
第一種情況
對于第1點(diǎn)來說,我們用到最多的就是entity和dto之間的轉(zhuǎn)換了,這個我們可以使用Spring的工具類BeanUtils來解決,這里要注意的一點(diǎn)是,==第一個參數(shù)是源,第二個參數(shù)是目標(biāo)==。
import org.springframework.beans.BeanUtils; BeanUtils.copyProperties(origin, target);
第二種情況
但是對于第2點(diǎn)來說,就沒有那么簡單了,再使用BeanUtils已經(jīng)不能滿足我們的需要了。
我們可以使用jackson的ObjectMapper
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在反序列化時,忽略目標(biāo)對象沒有的屬性。凡是使用該objectMapper反序列化時,都會擁有該特性。 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //讀入需要更新的目標(biāo)實(shí)體 ObjectReader objectReader = objectMapper.readerForUpdating(target); //將源實(shí)體的值賦值到目標(biāo)實(shí)體上 objectReader.readValue(JSON.toJSONString(source));
我們總結(jié)一下objectMapper的過濾參數(shù):
/* 通過該方法對mapper對象進(jìn)行設(shè)置,所有序列化的對象都將按改規(guī)則進(jìn)行系列化 Include.Include.ALWAYS 默認(rèn) Include.NON_DEFAULT 屬性為默認(rèn)值不序列化 Include.NON_EMPTY 屬性為 空(“”) 或者為 NULL 都不序列化 Include.NON_NULL 屬性為NULL 不序列化 */ objectMapper.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT); String outJson = objectMapper.writeValueAsString(productDetail); //上面代碼里,outJson的值將會過濾掉只有默認(rèn)值的屬性
第三種情況
本情況主要對于從dto到entity轉(zhuǎn)換過程中出現(xiàn) ,比如一個put操作,前端可能只修改某幾個屬性,而在后端處理時也只希望處理這幾個被賦值的屬性,這時我們使用下面的方法:
@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的使用,確實(shí)讓我們少寫很多重復(fù)的代碼。
總結(jié)
以上所述是小編給大家介紹的springboot~ObjectMapper~dto到entity的自動賦值,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
try-cache-finally讀取文件錯誤try-with-resources使用方法
這篇文章主要為大家介紹了try-cache-finally讀取文件錯誤try-with-resources使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Java中的runnable 和 callable 區(qū)別解析
Runnable接口用于定義不需要返回結(jié)果的任務(wù),而Callable接口可以返回結(jié)果并拋出異常,通常與Future結(jié)合使用,Runnable適用于簡單的后臺任務(wù)和定時任務(wù),而Callable適用于并行計算、異步操作和復(fù)雜任務(wù),選擇使用哪個接口取決于具體的應(yīng)用場景,感興趣的朋友一起看看吧2025-03-03
使用idea+gradle編譯spring5.x.x源碼分析
這篇文章主要介紹了idea?+?gradle編譯spring5.x.x源碼,在編譯spring5源碼時需要將項(xiàng)目導(dǎo)入idea中然后編譯配置,本文給大家講解的非常詳細(xì),需要的朋友可以參考下2022-04-04
Java Session驗(yàn)證碼案例代碼實(shí)例解析
這篇文章主要介紹了Java Session驗(yàn)證碼案例代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
解決微服務(wù)feign調(diào)用添加token的問題
這篇文章主要介紹了解決微服務(wù)feign調(diào)用添加token的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Spring Data JPA中findOne()和getOne()用法
這篇文章主要介紹了Spring Data JPA中findOne()和getOne()的用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11

