MyBatisマッパーファイルにエンティティを含む
-
26-10-2019 - |
質問
Ibatis 2.xからMyBatis 3.0.6にアップグレードしています。次のように外部エンティティを含むマッパーファイルがあります。
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"
[
<!ENTITY rating_analysis_state_cases SYSTEM "classpath://ibatis/includes/rating_analysis_state_cases.sql">
]>
Ibatisの下では、これは正常に動作していました。
私が行った唯一の構造的な変更は、IbatisフォルダーをMyBatisに変更したことです。
しかし、私が今それを実行するとき、私は次の例外/stacktraceを取得します:
Caused By: java.net.MalformedURLException: unknown protocol: classpath
at java.net.URL.<init>(URL.java:574)
at java.net.URL.<init>(URL.java:464)
at java.net.URL.<init>(URL.java:413)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:650)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1315)
私が知らないかもしれない何かが変わったかどうかについて誰かが考えていますか?
ClassPathは既知のプロトコルではありませんか?そうでない場合、どのプロトコルを使用できますか?
解決
おそらくMyBatisとは何の関係もありません。または、ClassPathプロトコルは、懸念の原則の分離を使用して、両方のコンポーネントの外側で処理する必要があるため、Xerces。 Ibatisには「ClassPath:」プロトコルハンドラーが登録されているとは思わない - 私が持っているソースコードには、ありません URLStreamHandler
実装。たぶん、あなたのスタックの他のコンポーネントがそれをしたかもしれません、そして、あなたはMyBatisに切り替えるときにそれを削除しました。
本質的に、 JavaのClassPathからリソースをロードするURL あなたのために答えがあります。
あなたがする必要があるのは、小さなクラスを追加することだけです URLStreamHandler
aを実装します URLStreamHandlerFactory
. 。どちらも非常にシンプルで、約12行のコードが必要です。
以前のテクノロジースタックを見てみてください。 java.net.URLStreamHandler
いくつかのコンポーネントによって行われた実装(バイナリファイルでの全文検索がトリックを行いますが、実際に「classpath:」を実装しているかどうかを確認する必要があります - 上記の答えは徹底的な洞察を提供します)