使用XSD校验Mybatis的SqlMapper配置文件的方法(2)
作者:linjisong 发布时间:2023-06-29 07:51:34
在上篇文章给大家介绍了使用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()方法也很简洁:
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);
}
解析上下文和解析器实现类又依次分为三个层级:
(1)通用解析上下文:
public interface IParserContext {
public ProblemReporter getProblemReporter();
public EventListener getEventListener();
public SourceExtractor getSourceExtractor();
public Environment getEnvironment();
}
相应层级的解析器实现类主要负责加载被解析文件(比如将字符串通配符加载为Resource对象集合),保证不重复解析,保证可并发执行等。
(2)XML解析上下文
public interface IXmlParserContext extends IParserContext{
public boolean isNamespaceAware();
public DocumentLoader getDocumentLoader();
public EntityResolver getEntityResolver();
public ErrorHandler getErrorHandler();
public XmlParserDelegate getDelegate();
}
相应层级的解析器实现类主要负责将Resource转换为Document对象,并在转换的过程中进行校验。
(3)SqlMapper解析上下文
public interface ISqlMapperParserContext extends IXmlParserContext{
public Configuration getConfiguration();
}
相应层级的解析器实现类主要负责查找根元素所在命名空间的解析器,并使用解析器对Document进行解析。
最终,将解析委托给ini配置文件中的SchemaSqlMapperNamespaceParser类,但是因为这个类需要在文本文件中配置,不方便有参数的构造函数,因而进一步委托给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校验已经完成,也已经找到XML解析入口,后续就是在SchemaSqlMapperParserDelegate中真正的解析了。
以上所述是小编给大家介绍的使用XSD校验Mybatis的SqlMapper配置文件的方法(2)网站的支持!
来源:http://www.cnblogs.com/linjisong/p/6036613.html
猜你喜欢
- 1: Nacos搭建可以参考 https://www.jb51.net/article/196842.htmSpringCloud 版本&l
- 由于要做一个新项目,所以打算做一个简单的图片验证码。先说说思路吧:在服务端,从一个文件夹里面找出8张图片,再把8张图片合并成一张大图,在8个
- 原因:feign传值出错无法接收到传值由于是POST所以添加@RequestBody进行尝试解决:错误原因是未添加@RequestBody尝
- SpringBoot找不到javax.servlet.Filter的问题新创建一个SpringBoot项目,编译时出现了找不到javax.s
- 之前做到日期时间的时候,有许多格式问题和日期时间比较问题,以及相关条件约束,因为不熟悉这个,浪费许多时间,查找相关资料,记录,以作备用。1.
- 本文实例讲述了Hibernate实现批量添加数据的方法。分享给大家供大家参考,具体如下:1.Hibernate_016_Ba
- 一、前言随着互联网项目前后端分离方式的流行,前端与后端交给不同的人员开发,项目沟通成本也随之提高。主要表现在WebAPI接口的沟通,Swag
- 在使用fastJson时,对于泛型的反序列化很多场景下都会使用到TypeReference,例如:void testTypeReferenc
- 现有的热修复框架很多,尤以AndFix 和Tinker比较多具体的实现方式和项目引用可以参考网络上的文章,今天就不谈,也不是主要目的今天就来
- 程序生成的自定义文件,比如后缀是.test这种文件怎么直接启动打开程序,并打开本文件呢 1、
- 本文主要给大家介绍的是关于Android实现微信雷达扫描效果的相关内容,分享出来供大家参考学习,下面来看看详细的介绍:废话不多说 先上图(用
- 前言数独是一种有趣的智力游戏,但是部分高难度数独在求解过程中经常出现大量单元格有多个候选数字可以填入,不得不尝试填写某个数字然后继续推导的方
- 各个方法1. 得到class的成员变量首先得到object的class对象然后在class对象中用getDeclaredFields()方法
- 一、创建项目并导入相关依赖<dependency> <groupId>org.springframewo
- 前言平时在搬砖的时候,大家有没有遇到过这样的一个场景,由于各种不可描述因素导致,一个接口返回的数据 里面的 key 是 A , 但是客户端(
- 一、前言拖拽(Drag&Drop),属于是极其常用的基础功能。无论是在系统上、应用上、还是在网页上,拖拽随处可见。同时拖拽时的鼠标效
- 导读 Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用
- 本文给大家分享Android视频播放器屏幕左侧边随手指上下滑动亮度调节功能的原理实现,具体代码如下所示:import android.app
- 在上节使用了H2之后感觉很爽,很轻便,正好有个项目要求简单,最好不适用外部数据库,于是就想着把H2数据库集成进来,这个系统已经存在了一个Or
- java8 Stream大数据量List分批处理//按每3个一组分割private static final Integer MAX_NUM