国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JsonIgnore誤用引發(fā)的對象綁定問題

王巖威 / 977人閱讀

摘要:問題描述開發(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)該評論的實體,所以建了兩個額外的屬性serviceNamerelationId,但是這個僅在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 requiredType)動態(tài)獲取Bean的時候,拋出了異常,requiredType不能為空,也就是我們調用getBean傳的參數(shù)className是空。

調試 Debug

開啟找Bug模式,我們看我們測試請求的字符串json是沒問題,屬性齊全。

走到控制器時,這兩個屬性就沒了。結論:Json反序列化時出錯。

JsonIgnore

原因就在@JsonIgnore上,我只考慮了后臺的對象序列化到前臺時需要忽略該屬性,從而添加了這個注解。

但是這個注解是在序列化與反序列化時都生效的,也就是說:序列化時,忽略該屬性;反序列化時,也忽略該屬性。所以造成了綁定時@JsonIgnore標注的屬性為null的結果。

解決

去掉@JsonIgnore注解,一切正常。

總結

記得第一次見到@JsonIgnore注解時去網上查這個注解時干什么的。

谷歌第一條。然后,沒有認真看,一直以為是JsonIgnore只在對象序列化為json是才起作用。導致了誤用。

JsonIgnore在序列化與反序列化時都生效!

一知半解,害己誤人。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76785.html

相關文章

  • JQuery坑,說說哪些大家都踩過

    摘要:回調在請求成功或失敗都會觸發(fā)。為避免多次執(zhí)行,請先做事件解綁再重新綁定。避免響應多次執(zhí)行錯誤使用指示符坑人指數(shù)指示符存在于一定的上下文中的,當上下文變化時指向不同的對象。 1 亂用選擇器 坑人指數(shù):200 JQuery選擇器調用代價很大,反復調用效率更低。應采用緩存對象的方法或采用鏈式調用的方式。 //錯誤的寫法 $(#button).click(function(){ $(#...

    habren 評論0 收藏0
  • 字符串拼接引發(fā)BUG

    摘要:你的線上代碼真的沒有嗎歡迎免費使用我們可以幫助您第一時間發(fā)現(xiàn)字符串拼接加法仔細查看生成的代碼,你會發(fā)現(xiàn)出現(xiàn)在標記的后面,然而標簽不見了。在中,根據(jù)左右兩邊變量的類型的不同,符號可以用于數(shù)字相加或則字符串拼接。然后又轉換為字符串拼接起來。 譯者按: bug雖小,卻是個磨人的小妖精! 原文: Fixing a bug: when concatenated strings turn int...

    zengdongbao 評論0 收藏0
  • Spring Boot QuickStart (5) - Spring Data JPA

    摘要:關聯(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...

    sutaking 評論0 收藏0
  • Spring Boot 返回 JSON 數(shù)據(jù),一分鐘搞定!

    摘要:在項目中返回數(shù)據(jù)是常見的交互形式,在中這一切都變得十分簡單。返回數(shù)據(jù)格式定義定義返回方式在類上面用定義或者在方法上面用定義,表明是在區(qū)域輸出數(shù)據(jù)。返回數(shù)據(jù)棧長正在拼命寫作中,過兩天我的公眾號會第一時間分享。 在 WEB 項目中返回 JSON 數(shù)據(jù)是常見的交互形式,在 Spring Boot 中這一切都變得十分簡單。So easy!!! 你所需具備的基礎 什么是 Spring Boot...

    Backache 評論0 收藏0
  • (討論)緩存同步、如何保證緩存一致性、緩存誤用

    摘要:總結允許的緩存寫場景大部分情況,修改成本會高于增加一次,因此應該淘汰緩存如果還在糾結,總是淘汰緩存,問題也不大先操作數(shù)據(jù)庫,還是先操作緩存這里分了兩種觀點,的觀點沈老師的觀點。這里我覺得沈老師可能忽略了并發(fā)的問題,比如說以下情況一個寫請求 緩存誤用 緩存,是互聯(lián)網分層架構中,非常重要的一個部分,通常用它來降低數(shù)據(jù)庫壓力,提升系統(tǒng)整體性能,縮短訪問時間。 有架構師說緩存是萬金油,哪里有問...

    msup 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<