摘要:問題描述開發(fā)通用評論功能時,建立評論實體。調試開啟找模式,我們看我們測試請求的字符串是沒問題,屬性齊全。所以造成了綁定時標注的屬性為的結果。在序列化與反序列化時都生效一知半解,害己誤人。
問題描述 Comment
開發(fā)通用評論功能時,建立評論實體。
/** * @author zhangxishuo on 2018/8/19 * 評論實體 */ @Entity @ApiModel(value = "Comment (評論)", description = "評論實體") public class Comment extends YunZhiAbstractEntity { private static final Map> serviceMap = new HashMap<>(); static { serviceMap.put("NonMandatoryInstrumentCheckApplyService", NonMandatoryInstrumentCheckApplyService.class); } @Column(length = 3000) private String content; @Transient // 該字段不映射到數(shù)據(jù)庫 @JsonIgnore // 序列化時忽略屬性 private String serviceName; @Transient // 該字段不映射到數(shù)據(jù)庫 @JsonIgnore // 序列化時忽略屬性 private Long relationId; }
這里因為考慮到需要將信息傳遞給相關聯(lián)該評論的實體,所以建了兩個額外的屬性serviceName和relationId,但是這個僅在Service中使用,并不映射到數(shù)據(jù)庫,同時也不希望這個字段映射到前臺是也顯示。
測試代碼@Test public void saveTest() throws Exception { logger.debug("測試數(shù)據(jù)"); NonMandatoryInstrumentCheckApply nonMandatoryInstrumentCheckApply = nonMandatoryInstrumentCheckApplyService.getOneSavedObject(); Long relationId = nonMandatoryInstrumentCheckApply.getId(); String content = "測試評論"; String serviceName = "NonMandatoryInstrumentCheckApplyService"; logger.debug("生成評論"); Comment comment = new Comment(); comment.setRelationId(relationId); comment.setContent(content); comment.setServiceName(serviceName); String json = JSONObject.toJSONString(comment); this.mockMvc .perform(MockMvcRequestBuilders.post("/Comment") .content(json) .contentType(MediaType.APPLICATION_JSON_UTF8)) .andDo(document("Comment_save", preprocessResponse(prettyPrint()))) .andExpect(MockMvcResultMatchers.status().isOk()); }
看著好像沒什么問題,但是執(zhí)行時發(fā)生了錯誤,Required type must not be null。
logger.debug("獲取服務Bean"); String serviceName = comment.getServiceName(); Class> className = Comment.getServiceMap().get(serviceName); Object service = ContextConfig.getContext().getBean(className);
在調用getBean(Class
開啟找Bug模式,我們看我們測試請求的字符串json是沒問題,屬性齊全。
走到控制器時,這兩個屬性就沒了。結論:Json反序列化時出錯。
JsonIgnore原因就在@JsonIgnore上,我只考慮了后臺的對象序列化到前臺時需要忽略該屬性,從而添加了這個注解。
但是這個注解是在序列化與反序列化時都生效的,也就是說:序列化時,忽略該屬性;反序列化時,也忽略該屬性。所以造成了綁定時@JsonIgnore標注的屬性為null的結果。
解決去掉@JsonIgnore注解,一切正常。
總結記得第一次見到@JsonIgnore注解時去網上查這個注解時干什么的。
谷歌第一條。然后,沒有認真看,一直以為是JsonIgnore只在對象序列化為json是才起作用。導致了誤用。
JsonIgnore在序列化與反序列化時都生效!
一知半解,害己誤人。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76785.html
摘要:回調在請求成功或失敗都會觸發(fā)。為避免多次執(zhí)行,請先做事件解綁再重新綁定。避免響應多次執(zhí)行錯誤使用指示符坑人指數(shù)指示符存在于一定的上下文中的,當上下文變化時指向不同的對象。 1 亂用選擇器 坑人指數(shù):200 JQuery選擇器調用代價很大,反復調用效率更低。應采用緩存對象的方法或采用鏈式調用的方式。 //錯誤的寫法 $(#button).click(function(){ $(#...
摘要:你的線上代碼真的沒有嗎歡迎免費使用我們可以幫助您第一時間發(fā)現(xiàn)字符串拼接加法仔細查看生成的代碼,你會發(fā)現(xiàn)出現(xiàn)在標記的后面,然而標簽不見了。在中,根據(jù)左右兩邊變量的類型的不同,符號可以用于數(shù)字相加或則字符串拼接。然后又轉換為字符串拼接起來。 譯者按: bug雖小,卻是個磨人的小妖精! 原文: Fixing a bug: when concatenated strings turn int...
摘要:關聯(lián)關系的關聯(lián)關系定義上,感覺并不是很靈活,姿勢也比較難找。如,定義在關聯(lián)關系上的參數(shù)可以設置級聯(lián)的相關東西。因為序列化會涉及到實體類關聯(lián)對象的獲取,會觸發(fā)所有的關聯(lián)關系。 接(4) - Database 系列. Java Persistence API,可以理解就是 Java 一個持久化標準或規(guī)范,Spring Data JPA 是對它的實現(xiàn)。并且提供多個 JPA 廠商適配,如 Hi...
摘要:在項目中返回數(shù)據(jù)是常見的交互形式,在中這一切都變得十分簡單。返回數(shù)據(jù)格式定義定義返回方式在類上面用定義或者在方法上面用定義,表明是在區(qū)域輸出數(shù)據(jù)。返回數(shù)據(jù)棧長正在拼命寫作中,過兩天我的公眾號會第一時間分享。 在 WEB 項目中返回 JSON 數(shù)據(jù)是常見的交互形式,在 Spring Boot 中這一切都變得十分簡單。So easy!!! 你所需具備的基礎 什么是 Spring Boot...
摘要:總結允許的緩存寫場景大部分情況,修改成本會高于增加一次,因此應該淘汰緩存如果還在糾結,總是淘汰緩存,問題也不大先操作數(shù)據(jù)庫,還是先操作緩存這里分了兩種觀點,的觀點沈老師的觀點。這里我覺得沈老師可能忽略了并發(fā)的問題,比如說以下情況一個寫請求 緩存誤用 緩存,是互聯(lián)網分層架構中,非常重要的一個部分,通常用它來降低數(shù)據(jù)庫壓力,提升系統(tǒng)整體性能,縮短訪問時間。 有架構師說緩存是萬金油,哪里有問...
閱讀 1290·2021-11-24 09:39
閱讀 2632·2021-09-30 09:47
閱讀 1325·2021-09-22 15:15
閱讀 2410·2021-09-10 10:51
閱讀 1955·2019-08-30 15:55
閱讀 2977·2019-08-30 11:06
閱讀 896·2019-08-30 10:53
閱讀 830·2019-08-29 17:26