shardingsphere 之 ShardingParsingRuleRegistry 加載報錯定位

問題

在使用 shardingsphere 時,在執(zhí)行sql查詢語句時報了一個異常:

### Cause: java.lang.NullPointerException
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
    ... 110 common frames omitted
Caused by: java.lang.NullPointerException: null
    at org.apache.shardingsphere.core.parse.antlr.rule.registry.ParsingRuleRegistry.findSQLStatementRule(ParsingRuleRegistry.java:117)
    at org.apache.shardingsphere.core.parse.antlr.parser.SQLParserEngine.parse(SQLParserEngine.java:55)
    at org.apache.shardingsphere.core.parse.antlr.AntlrParsingEngine.parse(AntlrParsingEngine.java:67)
    at org.apache.shardingsphere.core.parse.SQLParsingEngine.parse(SQLParsingEngine.java:61)
    at org.apache.shardingsphere.core.route.router.sharding.ParsingSQLRouter.parse(ParsingSQLRouter.java:78)
    at org.apache.shardingsphere.core.route.PreparedStatementRoutingEngine.route(PreparedStatementRoutingEngine.java:64)
    at org.apache.shardingsphere.core.PreparedQueryShardingEngine.route(PreparedQueryShardingEngine.java:60)
    at org.apache.shardingsphere.core.BaseShardingEngine.shard(BaseShardingEngine.java:64)
    at org.apache.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingPreparedStatement.shard(ShardingPreparedStatement.java:224)
    at org.apache.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingPreparedStatement.execute(ShardingPreparedStatement.java:170)

根據(jù)異常信息,定位到ParsingRuleRegistry的代碼愁拭,實際為集合parserRuleDefinitions 為空:

public Optional<SQLStatementRule> findSQLStatementRule(final DatabaseType databaseType, final String contextClassName) {
        return Optional.fromNullable(parserRuleDefinitions.get(DatabaseType.H2 == databaseType ? DatabaseType.MySQL : databaseType).getSqlStatementRuleDefinition().getRules().get(contextClassName));
    }

那么看集合 parserRuleDefinitions 是如何加載的望拖,為何為空蔓倍? 依次繼續(xù)定位到 ShardingParsingRuleRegistry 的 init 方法

public static ParsingRuleRegistry getInstance() {
        if (null == instance) {
            synchronized (ShardingParsingRuleRegistry.class) {
                if (null == instance) {
                    instance = new ShardingParsingRuleRegistry();
                    instance.init();
                }
            }
        }
        return instance;
}

其中胰舆,在 instance.init() 方法中進行了來個類的數(shù)據(jù)初始化昨登,即:

 protected final void init() {
        initCommonParserRuleDefinition();
        initParserRuleDefinition();
    }

其中 initParserRuleDefinition 就是我們報空指針的集合的初始化的地方播演,于是在這兩個通過打斷點方式啟動調試冀瓦,調試時發(fā)現(xiàn),initParserRuleDefinition 沒有調用就結束了写烤,所以初步判定在 initCommonParserRuleDefinition 時發(fā)生了異常翼闽。

于是重點放在 initParserRuleDefinition方法的追蹤,最終定位到一個 Method threw 'java.lang.ClassNotFoundException' exception. 異常信息洲炊,具體代碼為:


public final class FillerRuleDefinitionEntityLoader implements RuleDefinitionEntityLoader {
    
    @Override
    @SneakyThrows
    public FillerRuleDefinitionEntity load(final String fillerRuleDefinitionFile) {
        InputStream inputStream = FillerRuleDefinitionEntityLoader.class.getClassLoader().getResourceAsStream(fillerRuleDefinitionFile);
        Preconditions.checkNotNull(inputStream, "Cannot load SQL filler rule definition file :%s, ", fillerRuleDefinitionFile);
        return (FillerRuleDefinitionEntity) JAXBContext.newInstance(FillerRuleDefinitionEntity.class).createUnmarshaller().unmarshal(inputStream);//此行異常  ClassNotFoundException
    }
}

這個地方比較坑人的時 這個異常并沒有在控制臺輸出感局,而是被shardingsphere吃掉了,所以比較難以定位暂衡。

解決

  • 方法一:將 jdk的運行版本將為 1.8询微,我的默認是1.9所以出現(xiàn)了異常。
  • 方法二:將 JAXB 相關jar包重新引入狂巢,具體maven
 <dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末撑毛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子唧领,更是在濱河造成了極大的恐慌藻雌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斩个,死亡現(xiàn)場離奇詭異胯杭,居然都是意外死亡,警方通過查閱死者的電腦和手機受啥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門歉摧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腔呜,你說我怎么就攤上這事叁温。” “怎么了核畴?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵膝但,是天一觀的道長。 經常有香客問我谤草,道長跟束,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任丑孩,我火速辦了婚禮冀宴,結果婚禮上,老公的妹妹穿的比我還像新娘温学。我一直安慰自己略贮,他們只是感情好,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布仗岖。 她就那樣靜靜地躺著逃延,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轧拄。 梳的紋絲不亂的頭發(fā)上揽祥,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機與錄音檩电,去河邊找鬼拄丰。 笑死,一個胖子當著我的面吹牛俐末,可吹牛的內容都是我干的料按。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼鹅搪,長吁一口氣:“原來是場噩夢啊……” “哼站绪!你這毒婦竟也來了?” 一聲冷哼從身側響起丽柿,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤恢准,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后甫题,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馁筐,經...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年坠非,在試婚紗的時候發(fā)現(xiàn)自己被綠了敏沉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖盟迟,靈堂內的尸體忽然破棺而出秋泳,到底是詐尸還是另有隱情,我是刑警寧澤攒菠,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布迫皱,位于F島的核電站,受9級特大地震影響辖众,放射性物質發(fā)生泄漏卓起。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一凹炸、第九天 我趴在偏房一處隱蔽的房頂上張望戏阅。 院中可真熱鬧,春花似錦啤它、人聲如沸奕筐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽救欧。三九已至,卻和暖如春锣光,著一層夾襖步出監(jiān)牢的瞬間笆怠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工誊爹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蹬刷,地道東北人。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓频丘,卻偏偏與公主長得像办成,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子搂漠,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內容

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔迂卢,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,739評論 2 9
  • IOC 控制反轉容器控制程序對象之間的關系桐汤,而不是傳統(tǒng)實現(xiàn)中而克,有程序代碼之間控制,又名依賴注入怔毛。All 類的創(chuàng)建员萍,...
    irckwk1閱讀 934評論 0 0
  • 問題 什么時候加載? 怎么加載拣度? 類生命周期 從加載到卸載碎绎,整個生命周期有7個階段螃壤。其中驗證、準備筋帖、解析3個部分統(tǒng)...
    lsh的學習筆記閱讀 131評論 0 0
  • 虛擬機把描述類的數(shù)據(jù)從Class文件加載到內存奸晴, 并對數(shù)據(jù)進行校驗、轉換解析和初始化幕随, 最終形成可以被虛擬機直接使...
    好好學習Sun閱讀 1,193評論 0 3
  • 代碼編譯的結果從本地機器碼轉變?yōu)樽止?jié)碼蚁滋,是存儲格式發(fā)展的一小步,確實編譯語言發(fā)展的一大步赘淮。 虛擬機把描述類的數(shù)據(jù)從...
    胡二囧閱讀 950評論 0 0