1

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 に変更したことです。

ただし、実行すると、次の例外/スタックトレースが発生します。

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)

私が知らないかもしれない何かが変更されたかどうかについて、誰かが何か考えを持っていますか?

クラスパスは既知のプロトコルではありませんか? そうでない場合、どのプロトコルをどのように使用できますか?

4

1 に答える 1

1

おそらくMyBATISとは関係ありません。または、Xerces については、クラスパス プロトコルは両方のコンポーネントの外部で処理する必要があるため、関心の分離の原則を使用します。iBATIS に "classpath:" プロトコル ハンドラが登録されているとは思えません。私が持っているソース コードにはURLStreamHandler実装がありません。ただし、スタック上の他のコンポーネントがそれを行い、myBatis に切り替えるときに削除した可能性があります。

基本的に、Java のクラスパスからリソースをロードするための URL に答えがあります。

あなたがする必要があるのは、拡張URLStreamHandlerして実装する小さなクラスを追加することだけですURLStreamHandlerFactory. どちらも非常に単純で、数十行のコードが必要です。

何らかのコンポーネントによって実装が行われた場合は、以前のテクノロジ スタックを調べてみることができますjava.net.URLStreamHandler(バイナリ ファイルでの全文検索でうまくいきますが、実際に「classpath:」を実装しているかどうかを確認する必要があります - 上記の回答)。徹底的な洞察を提供します)

于 2012-02-22T21:22:57.797 に答える