zoukankan      html  css  js  c++  java
  • MyBatis报错 :Failed to read external DTD 'mybatis-3-config.dtd'... http ... accessExternalDTD...

      当前我的解决方式是在MyBatis源码基础上,因为需要修改一点点源码,如果不是使用源码则另寻它法。报错如图所示:

    java.lang.ExceptionInInitializerError
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.junit.platform.commons.util.ReflectionUtils.newInstance(ReflectionUtils.java:500)
        at org.junit.jupiter.engine.execution.ConstructorInvocation.proceed(ConstructorInvocation.java:56)
        at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:125)
        at org.junit.jupiter.api.extension.InvocationInterceptor.interceptTestClassConstructor(InvocationInterceptor.java:69)
        at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
        at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:104)
        at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:62)
        at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:43)
        at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:35)
        at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
        at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:77)
        at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestClassConstructor(ClassBasedTestDescriptor.java:329)
        at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateTestClass(ClassBasedTestDescriptor.java:276)
        at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.instantiateTestClass(ClassTestDescriptor.java:77)
        at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:258)
        at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$2(ClassBasedTestDescriptor.java:252)
        at java.util.Optional.orElseGet(Optional.java:267)
        at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$3(ClassBasedTestDescriptor.java:251)
        at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:29)
        at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:106)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:105)
        at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:69)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$1(NodeTestTask.java:107)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:107)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:75)
        at java.util.ArrayList.forEach(ArrayList.java:1257)
        at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
        at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
        at java.util.ArrayList.forEach(ArrayList.java:1257)
        at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
        at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
        at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
        at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
        at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
        at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229)
        at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197)
        at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211)
        at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191)
        at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
        at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)
        at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
        at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
        at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
    Caused by: org.apache.ibatis.exceptions.PersistenceException: 
    ### Error building SqlSession.
    ### Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance.  Cause: org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 26; External DTD: Failed to read external DTD 'mybatis-3-config.dtd', because 'file' access is not allowed due to restriction set by the accessExternalDTD property.
        at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
        at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:80)
        at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:64)
        at wy.hanyufang.cn.mybatis.MyBatisApplication.<clinit>(MyBatisApplication.java:34)
        ... 63 more
    Caused by: org.apache.ibatis.builder.BuilderException: Error creating document instance.  Cause: org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 26; External DTD: Failed to read external DTD 'mybatis-3-config.dtd', because 'file' access is not allowed due to restriction set by the accessExternalDTD property.
        at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:263)
        at org.apache.ibatis.parsing.XPathParser.<init>(XPathParser.java:127)
        at org.apache.ibatis.builder.xml.XMLConfigBuilder.<init>(XMLConfigBuilder.java:82)
        at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:77)
        ... 65 more
    Caused by: org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 26; External DTD: Failed to read external DTD 'mybatis-3-config.dtd', because 'file' access is not allowed due to restriction set by the accessExternalDTD property.
        at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
        at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
        at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
        at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
        at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1472)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(XMLDocumentScannerImpl.java:1157)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(XMLDocumentScannerImpl.java:1045)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:959)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:842)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
        at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
        at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
        at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:261)
        ... 68 more
    View Code

      1.方法一:(你可能会使用到的解决方法:https://blog.csdn.net/dingshuo168/article/details/103317453 )

      2. 最简单的方式,修改应用启动类的JVM,添加启动参数:缺点是如果使用Spring的@Test进行测试的,那么每次调用都要重新添加,非常烦~

    -Djavax.xml.accessExternalDTD=all

      3.直接修改源码,通过调试可以找到程序报错的位置(详细步骤就不写了...)

        · myBatis配置加载和运行位置:

    @RunWith(SpringRunner.class)
    class MyBatisApplication {
        private static SqlSessionFactoryBuilder factoryBuilder;
        private static SqlSessionFactory sqlSessionFactory;
        private static Transaction transaction;
        private static Connection connection;
        static{
            //获取配置文件
            factoryBuilder = new SqlSessionFactoryBuilder();
            sqlSessionFactory = factoryBuilder.build(HanServerApplication.class.getClassLoader()
                    .getResourceAsStream("mybatis-config.xml"));
    
            Environment environment = sqlSessionFactory.getConfiguration().getEnvironment();
            try {
                connection= environment.getDataSource().getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            transaction = new JdbcTransaction(connection);
        }
    
      //程序调用位置 @Test
    void test1() throws Exception{ SimpleExecutor simpleExecutor = new SimpleExecutor(sqlSessionFactory.getConfiguration(),transaction); MappedStatement mapper = sqlSessionFactory.getConfiguration() .getMappedStatement("wy.hanyufang.cn.mybatis.dao.testMapper.selectByPrimaryKey"); List<Object> objects = simpleExecutor.doQuery(mapper, 5075937, RowBounds.DEFAULT, SimpleExecutor.NO_RESULT_HANDLER, mapper.getBoundSql(5075937)); System.out.println(JSON.toJSONString(objects)); } }

      · 程序异常位置以及修改的位置(标红):

        解决办法就是:无论是读取 ...config.dtd 文件、还是读取 ...apper.dtd文件,都让它去读取项目resurce文件夹下的资源文件。

        如下所示:

          1.需要将 mybatis-3-config.dtd、mybatis-3-mapper.dtd 两个文件放到resource资源目录下。
            http://mybatis.org/dtd/mybatis-3-config.dtd
            http://mybatis.org/dtd/mybatis-3-mapper.dtd
            如图:

              

          2.我添加了两行代码,并且修改了 if 判断:

            private static final String MYBATIS_CONFIG_SYSTEM_local = "config/mybatis-3-config.dtd";
          private static final String MYBATIS_MAPPER_SYSTEM_local = "config/mybatis-3-mapper.dtd";

          
    如果需要读取 config.dtd 则让它去 MYBATIS_CONFIG_SYSTEM_local 路径下读取。
          
    如果需要读取 mapper.dtd 则让它去 MYBATIS_MAPPER_SYSTEM_local 路径下读取。
          
    package org.apache.ibatis.builder.xml;

    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Locale;

    import org.apache.ibatis.io.Resources;
    import org.xml.sax.EntityResolver;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;

    /**
    * Offline entity resolver for the MyBatis DTDs.
    *
    * @author Clinton Begin
    * @author Eduardo Macarron
    */
    public class XMLMapperEntityResolver implements EntityResolver {

    private static final String IBATIS_CONFIG_SYSTEM = "ibatis-3-config.dtd";
    private static final String IBATIS_MAPPER_SYSTEM = "ibatis-3-mapper.dtd";
    private static final String MYBATIS_CONFIG_SYSTEM = "mybatis-3-config.dtd";
    private static final String MYBATIS_CONFIG_SYSTEM_local = "config/mybatis-3-config.dtd";
    private static final String MYBATIS_MAPPER_SYSTEM_local = "config/mybatis-3-mapper.dtd";
    private static final String MYBATIS_MAPPER_SYSTEM = "mybatis-3-mapper.dtd";

    private static final String MYBATIS_CONFIG_DTD = "org/apache/ibatis/builder/xml/mybatis-3-config.dtd";
    private static final String MYBATIS_MAPPER_DTD = "org/apache/ibatis/builder/xml/mybatis-3-mapper.dtd";

    /**
    * Converts a public DTD into a local one.
    *
    * @param publicId
    * The public id that is what comes after "PUBLIC"
    * @param systemId
    * The system id that is what comes after the public id.
    * @return The InputSource for the DTD
    *
    * @throws org.xml.sax.SAXException
    * If anything goes wrong
    */
    @Override
    public InputSource resolveEntity(String publicId, String systemId) throws SAXException {
    try {
    if (systemId != null) {
    String lowerCaseSystemId = systemId.toLowerCase(Locale.ENGLISH);
    if (lowerCaseSystemId.contains(MYBATIS_CONFIG_SYSTEM) || lowerCaseSystemId.contains(IBATIS_CONFIG_SYSTEM)) {
    return getInputSource(MYBATIS_CONFIG_SYSTEM_local, publicId, systemId);
    } else if (lowerCaseSystemId.contains(MYBATIS_MAPPER_SYSTEM) || lowerCaseSystemId.contains(IBATIS_MAPPER_SYSTEM)) {
    return getInputSource(MYBATIS_MAPPER_SYSTEM_local, publicId, systemId);
    }
    }
    return null;
    } catch (Exception e) {
    throw new SAXException(e.toString());
    }
    }

    private InputSource getInputSource(String path, String publicId, String systemId) {
    InputSource source = null;
    if (path != null) {
    try {
    InputStream in = Resources.getResourceAsStream(path);
    source = new InputSource(in);
    source.setPublicId(publicId);
    source.setSystemId(systemId);
    } catch (IOException e) {
    // ignore, null is ok
    }
    }
    return source;
    }

    }
     

      3.修改后重新测试,完成,返回结果

     

    Connected to the target VM, address: '127.0.0.1:51594', transport: 'socket'
    11:58:29.803 [main] DEBUG org.apache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
    11:58:29.840 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
    11:58:29.840 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
    11:58:29.840 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
    11:58:29.840 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
    11:58:33.785 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 688593710.
    
    11:58:33.826 [main] DEBUG wy.hanyufang.cn.mybatis.dao.testMapper.selectByPrimaryKey - ==>  Preparing: select id, title, author from test where id = ?
    11:58:33.887 [main] DEBUG wy.hanyufang.cn.mybatis.dao.testMapper.selectByPrimaryKey - ==> Parameters: 5075937(Integer)
    11:58:33.934 [main] DEBUG wy.hanyufang.cn.mybatis.dao.testMapper.selectByPrimaryKey - <==      Total: 1
    [{"author":"用户:3","id":5075937,"title":"hello world:2"}]
  • 相关阅读:
    异常、中断、陷阱
    BigDecimal
    事务
    jsp的九大内置对象
    timer和ScheduledThreadPoolExecutor
    关于Python的导入覆盖解决办法
    RTTI
    Golang不会自动把slice转换成interface{}类型的slice
    Python中下划线的5种含义
    Python如何合并两个字典
  • 原文地址:https://www.cnblogs.com/mysouler/p/14352128.html
Copyright © 2011-2022 走看看