org.xml.sax.SAXParseException: Element type "bind" must be declared问题

今天在写一条SQL的时候,需要用到mybatis动态SQL中的bind标签,但是,启动项目的时候却给我抛出了个异常,启动失败org.xml.sax.SAXParseException: Element type "bind" must be declared

这个异常的大致意思就是说我的mybatis中的mapper.xml写得有问题,其中有一个标签未定义,是这个bind标签,我感觉很奇怪,明明代码提示都能出来的一个标签,怎么会是没有定义的标签,然后又看了一下mybatis中的那个mapper.xml中定义的dtd,


是通过公网中的http://mybatis.org/dtd/mybatis-3-mapper.dtd这个dtd文件来进行校验的,然后我把这个文件下载下来
































































































发现里面明明是有定义了这个bind标签的,感觉有点邪门。

然后就一步一步找mybatis源码查看

private Document createDocument(InputSource inputSource) {
    // important: this must only be called AFTER common constructor
    try {
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      factory.setValidating(validation);

      factory.setNamespaceAware(false);
      factory.setIgnoringComments(true);
      factory.setIgnoringElementContentWhitespace(false);
      factory.setCoalescing(false);
      factory.setExpandEntityReferences(true);

      DocumentBuilder builder = factory.newDocumentBuilder();
      builder.setEntityResolver(entityResolver);
      builder.setErrorHandler(new ErrorHandler() {
        public void error(SAXParseException exception) throws SAXException {
          throw exception;
        }

        public void fatalError(SAXParseException exception) throws SAXException {
          throw exception;
        }

        public void warning(SAXParseException exception) throws SAXException {
        }
      });
      return builder.parse(inputSource);
    } catch (Exception e) {
      throw new BuilderException("Error creating document instance.  Cause: " + e, e);
    }
  }

然后就找到这里,是这个地方抛出来的异常,然后在这个方法打了断点调试,看到

DocumentBuilder builder = factory.newDocumentBuilder();
builder.setEntityResolver(entityResolver);

这两行代码,setEntityResolver()这个方法是设置校验的,然后我通过调试,找到这个方法中的参数对应的对象是org.apache.ibatis.builder.xml.XMLMapperEntityResolver这个类的一个对象,然后我打开这个类源码进行查看,发现这个类竟然是将xml对应的通过公网上的dtd文件进行校验改成了通过本地jar包中的dtd文件进行校验,感觉已经找到原因了,然后我再找到这个本地jar包中的dtd文件org/apache/ibatis/builder/xml/mybatis-3-mapper.dtd 果然,这个jar包中是没有定义bind标签的,现在就好办了,找到了问题原因是jar引起的,那么升级这个jar的版本就解决了。

org.xml.sax.SAXParseException: Element type

这个就是之前用的jar

你可能感兴趣的:(后端,mybatis,mybatis,动态SQL,bind标签,dtd解析,XML规范)