在上篇文章給大家介紹了使用XSD校驗Mybatis的SqlMapper配置文件的方法(1),需要的朋友可以參考下。
編寫好XSD文件,然后來看怎么使用XSD文件校驗,并解析SqlMapper文件,也就是實現doParseSqlMapperResourceWithSchema()方法。
為了實現這個功能,有兩個基本要求:
(1)兼容性:需要兼容mybatis的原生配置,兼容有兩種層級,一種是使用DTD校驗,這個前面已經說了,走原來的流程,兼容性沒有問題;另一種就是走XSD校驗,但也需要兼容mybatis原生配置,這種兼容性一方面從上面修改的XSD文件去保證,另一方面也需要從XML的解析去保證。
(2)擴展性:修改的目的就是為了擴展性,所以擴展性也是一個基本要求。但是擴展性不是隨意性,也需要按照規范來擴展,這個規范就是自定義的XSD文件。
為了達到這兩個基本要求,下面是我的一種思路,主要借鑒于Spring的自定義命名空間:
1、創建一個EntityResolver,讀取類路徑下指定模式的配置文件,比如:"classpath*:**/dysd-*-namespaces.ini"
2、在ini文件中定義命名空間元信息,如:
使用命名空間作為Section的名稱,下面的schema、parser分別表示命名空間的xsd文件和解析器實現類,這樣就可以根據XML中的XSD命名空間找到校驗文件,并且有一個解析入口了。
說明:
apache的commons-configuration提供了ini格式文件的讀取API
Spring中使用META-INF/spring.schemas和META-INF/spring.handlers來存儲XSD文件和解析器實現類,這里我修改為使用ini文件集中配置
因為讀取的是所有類路徑下滿足通配符的ini文件,因此可以非常簡單的擴展其它命名空間,至于在Java中具體怎么使用XSD來校驗,這里就不細說了
我把XML的解析分解為三要素:解析上下文、解析器、被解析文件。doParseSqlMapperResourceWithSchema()方法也很簡潔:
1
2
3
4
|
protected void doParseSqlMapperResourceWithSchema(Configuration configuration, Resource mapperLocation){ ISqlMapperParserContext context = new SqlMapperParserContext(configuration); XmlParserUtils.parseXml(context, mapperLocation); } |
解析器接口如下:
1
2
3
4
5
6
|
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); } |
解析上下文和解析器實現類又依次分為三個層級:
(1)通用解析上下文:
1
2
3
4
5
6
|
public interface IParserContext { public ProblemReporter getProblemReporter(); public EventListener getEventListener(); public SourceExtractor getSourceExtractor(); public Environment getEnvironment(); } |
相應層級的解析器實現類主要負責加載被解析文件(比如將字符串通配符加載為Resource對象集合),保證不重復解析,保證可并發執行等。
(2)XML解析上下文
1
2
3
4
5
6
7
|
public interface IXmlParserContext extends IParserContext{ public boolean isNamespaceAware(); public DocumentLoader getDocumentLoader(); public EntityResolver getEntityResolver(); public ErrorHandler getErrorHandler(); public XmlParserDelegate getDelegate(); } |
相應層級的解析器實現類主要負責將Resource轉換為Document對象,并在轉換的過程中進行校驗。
(3)SqlMapper解析上下文
1
2
3
|
public interface ISqlMapperParserContext extends IXmlParserContext{ public Configuration getConfiguration(); } |
相應層級的解析器實現類主要負責查找根元素所在命名空間的解析器,并使用解析器對Document進行解析。
最終,將解析委托給ini配置文件中的SchemaSqlMapperNamespaceParser類,但是因為這個類需要在文本文件中配置,不方便有參數的構造函數,因而進一步委托給SchemaSqlMapperParserDelegate:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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校驗已經完成,也已經找到XML解析入口,后續就是在SchemaSqlMapperParserDelegate中真正的解析了。
以上所述是小編給大家介紹的使用XSD校驗Mybatis的SqlMapper配置文件的方法(2),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://www.cnblogs.com/linjisong/p/6036613.html