使用XSD校驗(yàn)Mybatis的SqlMapper配置文件的方法(2)
在上篇文章給大家介紹了使用XSD校驗(yàn)Mybatis的SqlMapper配置文件的方法(1),需要的朋友可以參考下。
編寫(xiě)好XSD文件,然后來(lái)看怎么使用XSD文件校驗(yàn),并解析SqlMapper文件,也就是實(shí)現(xiàn)doParseSqlMapperResourceWithSchema()方法。
為了實(shí)現(xiàn)這個(gè)功能,有兩個(gè)基本要求:
(1)兼容性:需要兼容mybatis的原生配置,兼容有兩種層級(jí),一種是使用DTD校驗(yàn),這個(gè)前面已經(jīng)說(shuō)了,走原來(lái)的流程,兼容性沒(méi)有問(wèn)題;另一種就是走XSD校驗(yàn),但也需要兼容mybatis原生配置,這種兼容性一方面從上面修改的XSD文件去保證,另一方面也需要從XML的解析去保證。
(2)擴(kuò)展性:修改的目的就是為了擴(kuò)展性,所以擴(kuò)展性也是一個(gè)基本要求。但是擴(kuò)展性不是隨意性,也需要按照規(guī)范來(lái)擴(kuò)展,這個(gè)規(guī)范就是自定義的XSD文件。
為了達(dá)到這兩個(gè)基本要求,下面是我的一種思路,主要借鑒于Spring的自定義命名空間:
1、創(chuàng)建一個(gè)EntityResolver,讀取類路徑下指定模式的配置文件,比如:"classpath*:**/dysd-*-namespaces.ini"
2、在ini文件中定義命名空間元信息,如:
使用命名空間作為Section的名稱,下面的schema、parser分別表示命名空間的xsd文件和解析器實(shí)現(xiàn)類,這樣就可以根據(jù)XML中的XSD命名空間找到校驗(yàn)文件,并且有一個(gè)解析入口了。
說(shuō)明:
apache的commons-configuration提供了ini格式文件的讀取API
Spring中使用META-INF/spring.schemas和META-INF/spring.handlers來(lái)存儲(chǔ)XSD文件和解析器實(shí)現(xiàn)類,這里我修改為使用ini文件集中配置
因?yàn)樽x取的是所有類路徑下滿足通配符的ini文件,因此可以非常簡(jiǎn)單的擴(kuò)展其它命名空間,至于在Java中具體怎么使用XSD來(lái)校驗(yàn),這里就不細(xì)說(shuō)了
我把XML的解析分解為三要素:解析上下文、解析器、被解析文件。doParseSqlMapperResourceWithSchema()方法也很簡(jiǎn)潔:
protected void doParseSqlMapperResourceWithSchema(Configuration configuration, Resource mapperLocation){ ISqlMapperParserContext context = new SqlMapperParserContext(configuration); XmlParserUtils.parseXml(context, mapperLocation); }
解析器接口如下:
public interface IParser<E extends IParserContext> { public void parse(E parserContext, String location); public void parse(E parserContext, String[] locationPatterns); public void parse(E parserContext, InputStream inputStream); public void parse(E parserContext, Resource resource); }
解析上下文和解析器實(shí)現(xiàn)類又依次分為三個(gè)層級(jí):
(1)通用解析上下文:
public interface IParserContext { public ProblemReporter getProblemReporter(); public EventListener getEventListener(); public SourceExtractor getSourceExtractor(); public Environment getEnvironment(); }
相應(yīng)層級(jí)的解析器實(shí)現(xiàn)類主要負(fù)責(zé)加載被解析文件(比如將字符串通配符加載為Resource對(duì)象集合),保證不重復(fù)解析,保證可并發(fā)執(zhí)行等。
(2)XML解析上下文
public interface IXmlParserContext extends IParserContext{ public boolean isNamespaceAware(); public DocumentLoader getDocumentLoader(); public EntityResolver getEntityResolver(); public ErrorHandler getErrorHandler(); public XmlParserDelegate getDelegate(); }
相應(yīng)層級(jí)的解析器實(shí)現(xiàn)類主要負(fù)責(zé)將Resource轉(zhuǎn)換為Document對(duì)象,并在轉(zhuǎn)換的過(guò)程中進(jìn)行校驗(yàn)。
(3)SqlMapper解析上下文
public interface ISqlMapperParserContext extends IXmlParserContext{ public Configuration getConfiguration(); }
相應(yīng)層級(jí)的解析器實(shí)現(xiàn)類主要負(fù)責(zé)查找根元素所在命名空間的解析器,并使用解析器對(duì)Document進(jìn)行解析。
最終,將解析委托給ini配置文件中的SchemaSqlMapperNamespaceParser類,但是因?yàn)檫@個(gè)類需要在文本文件中配置,不方便有參數(shù)的構(gòu)造函數(shù),因而進(jìn)一步委托給SchemaSqlMapperParserDelegate:
public class SchemaSqlMapperNamespaceParser implements INamespaceParser<ISqlMapperParserContext> { @Override public void init() { } @Override public void parse(ISqlMapperParserContext parserContext, Document document, Resource resource) { SchemaSqlMapperParserDelegate delegate = new SchemaSqlMapperParserDelegate(parserContext, document, resource); delegate.parse(); } @Override public void destory() { } }
至此,XSD校驗(yàn)已經(jīng)完成,也已經(jīng)找到XML解析入口,后續(xù)就是在SchemaSqlMapperParserDelegate中真正的解析了。
以上所述是小編給大家介紹的使用XSD校驗(yàn)Mybatis的SqlMapper配置文件的方法(2),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Java NIO原理圖文分析及代碼實(shí)現(xiàn)
本文主要介紹Java NIO原理的知識(shí),這里整理了詳細(xì)資料及簡(jiǎn)單示例代碼和原理圖,有需要的小伙伴可以參考下2016-09-09Spring實(shí)現(xiàn)動(dòng)態(tài)修改時(shí)間參數(shù)并手動(dòng)開(kāi)啟關(guān)停操作
spring實(shí)現(xiàn)定時(shí)任務(wù)的方式有三種,分別是java自帶的timer類、spring task和quartz三種。本文只介紹spring自帶的task和第三方quartz,感興趣的朋友參考下吧2017-09-09Java數(shù)據(jù)結(jié)構(gòu)之棧與綜合計(jì)算器的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)中棧與綜合計(jì)算器的實(shí)現(xiàn),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2022-10-10Spring?Boot?整合?FreeMarker?實(shí)例分享
這篇文章主要分享了Spring?Boot整合FreeMarker?實(shí)例FreeMarker是一款模板引擎,即一種基于模板和要改變的數(shù)據(jù),并用來(lái)生成輸出文本,更多相關(guān)介紹需要的小伙伴可以參考下面文章內(nèi)容2022-05-05關(guān)于maven pom文件配置加載lib下的jar包
在項(xiàng)目中引用放置在lib文件夾中的第三方j(luò)ar包需要通過(guò)POM文件進(jìn)行特定配置,雖然將依賴放置在公司的Maven私服是更好的做法,但如果遇到部署問(wèn)題,可以利用maven-jar-plugin進(jìn)行配置,Spring Boot項(xiàng)目可以通過(guò)特定設(shè)置來(lái)實(shí)現(xiàn)2024-09-09