摘要:問題描述開發通用評論功能時,建立評論實體。調試開啟找模式,我們看我們測試請求的字符串是沒問題,屬性齊全。所以造成了綁定時標注的屬性為的結果。在序列化與反序列化時都生效一知半解,害己誤人。
問題描述 Comment
開發通用評論功能時,建立評論實體。
/** * @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 // 該字段不映射到數據庫 @JsonIgnore // 序列化時忽略屬性 private String serviceName; @Transient // 該字段不映射到數據庫 @JsonIgnore // 序列化時忽略屬性 private Long relationId; }
這里因為考慮到需要將信息傳遞給相關聯該評論的實體,所以建了兩個額外的屬性serviceName和relationId,但是這個僅在Service中使用,并不映射到數據庫,同時也不希望這個字段映射到前臺是也顯示。
測試代碼@Test public void saveTest() throws Exception { logger.debug("測試數據"); 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()); }
看著好像沒什么問題,但是執行時發生了錯誤,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在序列化與反序列化時都生效!
一知半解,害己誤人。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/76785.html
摘要:回調在請求成功或失敗都會觸發。為避免多次執行,請先做事件解綁再重新綁定。避免響應多次執行錯誤使用指示符坑人指數指示符存在于一定的上下文中的,當上下文變化時指向不同的對象。 1 亂用選擇器 坑人指數:200 JQuery選擇器調用代價很大,反復調用效率更低。應采用緩存對象的方法或采用鏈式調用的方式。 //錯誤的寫法 $(#button).click(function(){ $(#...
摘要:你的線上代碼真的沒有嗎歡迎免費使用我們可以幫助您第一時間發現字符串拼接加法仔細查看生成的代碼,你會發現出現在標記的后面,然而標簽不見了。在中,根據左右兩邊變量的類型的不同,符號可以用于數字相加或則字符串拼接。然后又轉換為字符串拼接起來。 譯者按: bug雖小,卻是個磨人的小妖精! 原文: Fixing a bug: when concatenated strings turn int...
摘要:關聯關系的關聯關系定義上,感覺并不是很靈活,姿勢也比較難找。如,定義在關聯關系上的參數可以設置級聯的相關東西。因為序列化會涉及到實體類關聯對象的獲取,會觸發所有的關聯關系。 接(4) - Database 系列. Java Persistence API,可以理解就是 Java 一個持久化標準或規范,Spring Data JPA 是對它的實現。并且提供多個 JPA 廠商適配,如 Hi...
摘要:在項目中返回數據是常見的交互形式,在中這一切都變得十分簡單。返回數據格式定義定義返回方式在類上面用定義或者在方法上面用定義,表明是在區域輸出數據。返回數據棧長正在拼命寫作中,過兩天我的公眾號會第一時間分享。 在 WEB 項目中返回 JSON 數據是常見的交互形式,在 Spring Boot 中這一切都變得十分簡單。So easy!!! 你所需具備的基礎 什么是 Spring Boot...
摘要:總結允許的緩存寫場景大部分情況,修改成本會高于增加一次,因此應該淘汰緩存如果還在糾結,總是淘汰緩存,問題也不大先操作數據庫,還是先操作緩存這里分了兩種觀點,的觀點沈老師的觀點。這里我覺得沈老師可能忽略了并發的問題,比如說以下情況一個寫請求 緩存誤用 緩存,是互聯網分層架構中,非常重要的一個部分,通常用它來降低數據庫壓力,提升系統整體性能,縮短訪問時間。 有架構師說緩存是萬金油,哪里有問...
閱讀 1300·2021-11-24 09:39
閱讀 2672·2021-09-30 09:47
閱讀 1333·2021-09-22 15:15
閱讀 2419·2021-09-10 10:51
閱讀 1969·2019-08-30 15:55
閱讀 2982·2019-08-30 11:06
閱讀 903·2019-08-30 10:53
閱讀 840·2019-08-29 17:26