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 注册了“类路径:”协议处理程序 - 在我拥有的源代码中,没有URLStreamHandler实现。也许您堆栈中的其他一些组件确实做到了,但您在切换到 myBatis 时将其删除。

本质上,从 Java 中的类路径加载资源的 url为您提供了答案。

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

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

于 2012-02-22T21:22:57.797 回答