在myBatis映射文件中包含实体

时间:2012-02-16 18:09:08

标签: xml xml-parsing ibatis mybatis xml-entities

我正在从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)

有没有人知道我可能不知道的事情是否发生了变化?

类路径是不是已知的协议?如果没有,我可以使用什么协议以及如何使用?

1 个答案:

答案 0 :(得分:1)

它可能与MyBATIS无关。或者Xerces,因为类路径协议应该在两个组件之外处理,使用关注分离原则。我怀疑iBATIS已经注册了“classpath:”协议处理程序 - 在我的源代码中,没有URLStreamHandler实现。也许你的堆栈上的其他一些组件可以做到这一点,并且在切换到myBatis时你将其删除了。

基本上,url to load resources from the classpath in Java可以为您解答。

您需要做的就是添加一个扩展URLStreamHandler的小类并实现URLStreamHandlerFactory。两者都非常简单,需要大约十几行代码。

您可以尝试查看以前的技术堆栈,如果某个组件执行了java.net.URLStreamHandler实现(在二进制文件中进行全文搜索可以解决问题,但是您需要查看它是否实际执行“classpath:” - 上面的答案提供详尽的见解)