成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

王巖威 / 996人閱讀

摘要:問題描述開發(fā)通用評論功能時(shí),建立評論實(shí)體。調(diào)試開啟找模式,我們看我們測試請求的字符串是沒問題,屬性齊全。所以造成了綁定時(shí)標(biāo)注的屬性為的結(jié)果。在序列化與反序列化時(shí)都生效一知半解,害己誤人。

問題描述 Comment

開發(fā)通用評論功能時(shí),建立評論實(shí)體。

/**
 * @author zhangxishuo on 2018/8/19
 * 評論實(shí)體
 */
@Entity
@ApiModel(value = "Comment (評論)", description = "評論實(shí)體")
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   // 序列化時(shí)忽略屬性
    private String serviceName;

    @Transient    // 該字段不映射到數(shù)據(jù)庫
    @JsonIgnore   // 序列化時(shí)忽略屬性
    private Long relationId;
}

這里因?yàn)榭紤]到需要將信息傳遞給相關(guān)聯(lián)該評論的實(shí)體,所以建了兩個(gè)額外的屬性serviceNamerelationId,但是這個(gè)僅在Service中使用,并不映射到數(shù)據(jù)庫,同時(shí)也不希望這個(gè)字段映射到前臺是也顯示。

測試代碼
@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í)行時(shí)發(fā)生了錯(cuò)誤,Required type must not be null

logger.debug("獲取服務(wù)Bean");
String serviceName = comment.getServiceName();
Class className = Comment.getServiceMap().get(serviceName);
Object service = ContextConfig.getContext().getBean(className);

在調(diào)用getBean(Class requiredType)動態(tài)獲取Bean的時(shí)候,拋出了異常,requiredType不能為空,也就是我們調(diào)用getBean傳的參數(shù)className是空。

調(diào)試 Debug

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

走到控制器時(shí),這兩個(gè)屬性就沒了。結(jié)論:Json反序列化時(shí)出錯(cuò)。

JsonIgnore

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

但是這個(gè)注解是在序列化與反序列化時(shí)都生效的,也就是說:序列化時(shí),忽略該屬性;反序列化時(shí),也忽略該屬性。所以造成了綁定時(shí)@JsonIgnore標(biāo)注的屬性為null的結(jié)果。

解決

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

總結(jié)

記得第一次見到@JsonIgnore注解時(shí)去網(wǎng)上查這個(gè)注解時(shí)干什么的。

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

JsonIgnore在序列化與反序列化時(shí)都生效!

一知半解,害己誤人。

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76785.html

相關(guān)文章

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

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

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

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

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

    摘要:關(guān)聯(lián)關(guān)系的關(guān)聯(lián)關(guān)系定義上,感覺并不是很靈活,姿勢也比較難找。如,定義在關(guān)聯(lián)關(guān)系上的參數(shù)可以設(shè)置級聯(lián)的相關(guān)東西。因?yàn)樾蛄谢瘯婕暗綄?shí)體類關(guān)聯(lián)對象的獲取,會觸發(fā)所有的關(guān)聯(lián)關(guān)系。 接(4) - Database 系列. Java Persistence API,可以理解就是 Java 一個(gè)持久化標(biāo)準(zhǔn)或規(guī)范,Spring Data JPA 是對它的實(shí)現(xiàn)。并且提供多個(gè) JPA 廠商適配,如 Hi...

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

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

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

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

    msup 評論0 收藏0

發(fā)表評論

0條評論

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