我正在从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)
有没有人知道我可能不知道的事情是否发生了变化?
类路径是不是已知的协议?如果没有,我可以使用什么协议以及如何使用?
答案 0 :(得分:1)
它可能与MyBATIS无关。或者Xerces,因为类路径协议应该在两个组件之外处理,使用关注分离原则。我怀疑iBATIS已经注册了“classpath:”协议处理程序 - 在我的源代码中,没有URLStreamHandler
实现。也许你的堆栈上的其他一些组件可以做到这一点,并且在切换到myBatis时你将其删除了。
基本上,url to load resources from the classpath in Java可以为您解答。
您需要做的就是添加一个扩展URLStreamHandler
的小类并实现URLStreamHandlerFactory
。两者都非常简单,需要大约十几行代码。
您可以尝试查看以前的技术堆栈,如果某个组件执行了java.net.URLStreamHandler
实现(在二进制文件中进行全文搜索可以解决问题,但是您需要查看它是否实际执行“classpath:” - 上面的答案提供详尽的见解)