服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|编程技术|

服务器之家 - 编程语言 - JAVA教程 - 使用XSD校验Mybatis的SqlMapper配置文件的方法(2)

使用XSD校验Mybatis的SqlMapper配置文件的方法(2)

2020-07-01 11:41linjisong JAVA教程

这篇文章主要介绍了使用XSD校验Mybatis的SqlMapper配置文件的方法(2)的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下

在上篇文章给大家介绍了使用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

延伸 · 阅读

精彩推荐
  • JAVA教程自定义一个异常类模板的简单实例

    自定义一个异常类模板的简单实例

    下面小编就为大家带来一篇自定义一个异常类模板的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    java教程网3682020-06-20
  • JAVA教程Java线程的控制详解

    Java线程的控制详解

    这篇文章主要介绍了Java中的join线程、后台线程、线程睡眠、线程让步以及线程的优先级,非常的详细,希望能对大家有所帮助 ...

    hebedich3652019-12-04
  • JAVA教程Java的面向对象编程基本概念学习笔记整理

    Java的面向对象编程基本概念学习笔记整理

    这篇文章主要介绍了Java的面向对象编程基本概念学习笔记整理,包括类与方法以及多态等支持面向对象语言中的重要特点,需要的朋友可以参考下 ...

    xiaoyao38574352020-03-21
  • JAVA教程java String 转成Double二维数组的方法

    java String 转成Double二维数组的方法

    下面小编就为大家带来一篇java String 转成Double二维数组的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    jingxian2222020-06-23
  • JAVA教程Spark操作之aggregate、aggregateByKey详解

    Spark操作之aggregate、aggregateByKey详解

    这篇文章主要介绍了Spark操作之aggregate、aggregateByKey详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    午夜阳光psb3142019-07-08
  • JAVA教程java多线程编程之使用thread类创建线程

    java多线程编程之使用thread类创建线程

    在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例 ...

    java教程网3552019-11-04
  • JAVA教程Java自学书籍Top 10

    Java自学书籍Top 10

    这篇文章主要为大家推荐了Java书籍Top 10,是由Java Inside推荐的十本不错的Java书籍,感兴趣的小伙伴们可以参考一下 ...

    Java教程网1712020-06-18
  • JAVA教程详解Java线程编程中的volatile关键字的作用

    详解Java线程编程中的volatile关键字的作用

    这篇文章主要介绍了Java线程编程中的volatile关键字的作用,针对其禁止进行指令重排序和读写内存方面着重讲解,需要的朋友可以参考下 ...

    程晓明1562020-03-09