一、問題由來
下午快要下班時,登錄測試服務器查看日志信息,看看有沒有新的異常信息,如果有的話好及時修改。結果一看果然有新的異常信息。
主要的異常信息如下:
2020-10-13 14:51:03,036 [http-nio-8091-exec-10] ERROR c.s.f.controller.SmeControllerAdvice 164 - nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 'info.enterpCd!=null and info.enterpCd!='''. Cause: org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, "enterpCd")
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 'info.enterpCd!=null and info.enterpCd!='''. Cause: org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, "enterpCd")
心想這又是給自己找活干啊,既然有異常,那就及時改唄。第一步就是找到對應的mapper.xml文件,使用關鍵字info.enterpCd!=null and info.enterpCd!=''
進行搜索,很快找到了對應的xml文件,原代碼為:
異常就是這里拋出來的,一眼看上去也沒什么問題啊,怎么就拋異常了呢?
二、問題分析
從拋出的異常信息中可以看出大致意思是說,資源為null。然后立馬百度,查看了很多網友的意見,報的錯都是一模一樣的,由此找到了問題的真正原因;
報這個異常的真正原因是傳入的參數info為null,然后在使用null來取值null.enterpCd,因此報了這個異常。因為傳入的對象本身就為null,不能再從中取值。
三、解決方案
搞清楚問題的原因后,就很好解決了,在使用這個傳入的參數對象時,做一個非空校驗即可。先判斷這個對象不為null,然后在判斷對象的屬性不為null,
最后在使用對象里面的屬性,這就就可以避免上面的問題,修改后的代碼如下:
拓展.
這個問題在平時寫代碼的過程中,還真沒注意,一般都認為傳入XML中的對象參數不可能為null,可現在卻實實在在的出現這個問題。
在對這個項目進行改造的過程中,最初的開發人員基本都是按照info.enterpCd!=null and info.enterpCd!=''方式來寫的,只能以后遇到
一個修改一個。除了上面說的這種方式會拋出這種異常外,還有一種方式也會拋出同樣的異常。比如對象參數A中包含對象參數B,可
是對象參數B為null,使用時沒有對對象參數B做非空校驗,就直接使用對象參數B中的屬性值,這種情況同樣會報這個異常。