slf4j - Spring MVC测试中的logback NullPointer

时间:2016-06-05 00:45:31

标签: java spring logback slf4j

我正在运行一些单元测试,我使用的是SLF4J和logback。

这是相关的pom.xml

     <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.2.6-RELEASE</version>
    <exclusions>
      <exclusion>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
      </exclusion>
    </exclusions>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.7</version>
</dependency>   
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.7.21</version>
</dependency>

这是log和stacktrace:

20:29:16,293 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback-test.xml] at [file:/code/web/target/test-classes/logback-test.xml]
20:29:16,387 |-ERROR in ch.qos.logback.core.joran.event.SaxEventRecorder@7a1ebcd8 - Unexpected exception while parsing XML document. java.lang.NullPointerException
at java.lang.NullPointerException
at  at org.xml.sax.helpers.LocatorImpl.<init>(LocatorImpl.java:103)
at  at ch.qos.logback.core.joran.event.SaxEvent.<init>(SaxEvent.java:31)
at  at ch.qos.logback.core.joran.event.StartEvent.<init>(StartEvent.java:27)
at  at ch.qos.logback.core.joran.event.SaxEventRecorder.startElement(SaxEventRecorder.java:106)
at  at org.allcolor.xml.parser.CShaniSaxParser.parseStartTag(CShaniSaxParser.java:1393)
at  at org.allcolor.xml.parser.CXmlParser.parseSTARTTag(CXmlParser.java:1405)
at  at org.allcolor.xml.parser.CXmlParser.parse(CXmlParser.java:682)
at  at org.allcolor.xml.parser.CShaniSaxParser.parse(CShaniSaxParser.java:767)
at  at javax.xml.parsers.SAXParser.parse(SAXParser.java:392)
at  at ch.qos.logback.core.joran.event.SaxEventRecorder.recordEvents(SaxEventRecorder.java:59)
at  at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:141)
at  at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:103)
at  at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:53)
at  at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:75)
at  at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:150)
at  at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84)
at  at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55)
at  at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
at  at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
at  at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
at  at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
at  at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155)
at  at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132)
at  at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:685)
at  at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<clinit>(SpringJUnit4ClassRunner.java:91)
at  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at  at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at  at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at  at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)

logback-test.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>.%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg %n
            </Pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>TRACE</level>
        </filter>
    </appender>
    <root>
        <level value="INFO" />
        <appender-ref ref="consoleAppender" />
    </root> 
    <logger name="com.me.ControllerTester" level="debug" additivity="false">
        <appender-ref ref="consoleAppender" />
    </logger>
</configuration>

现在我检查了依赖树,我没有任何冲突。我试过搞乱SAX解析器版本。

XML看起来很好。我必须以某种方式发生冲突......

任何想法?

1 个答案:

答案 0 :(得分:2)

^使用SAXParserFactory.newInstance(),它有一个查找过程,用于确定要使用的实现。似乎在您的环境中基于此查找选择了logback

  

org.allcolor.xml.parser.CShaniSaxParser

     

获取public static SAXParserFactory newInstance()的新实例。此静态方法创建新的工厂实例此方法使用以下有序查找过程来确定要加载的SAXParserFactory实现类:

     
      
  • 使用SAXParserFactory系统属性。
  •   
  • 使用属性文件&#34; lib / jaxp.properties&#34;在JRE目录中。此配置文件采用标准javax.xml.parsers.SAXParserFactory格式,并包含实现类的完全限定名称,其中键是上面定义的系统属性。 jaxp.properties文件只能由JAXP实现读取一次,然后缓存它的值以备将来使用。如果在第一次尝试从该文件读取时该文件不存在,则不再进行任何检查以检查其是否存在。在第一次读取之后,无法更改jaxp.properties中任何属性的值。
  •   
  • 使用Services API(如JAR规范中详述)(如果可用)来确定类名。 Services API将在运行时可用的jar文件中查找文件java.util.Properties中的类名。
  •   
  • 平台默认META-INF/services/javax.xml.parsers.SAXParserFactory实例。
  •   
     

一旦应用程序获得对SAXParserFactory的引用,它就可以使用工厂来配置和获取解析器实例。

     

故障排除提示

     

设置SAXParserFactory系统属性将导致此方法向System.err打印大量调试消息,告知它正在做什么以及它在哪里查看。

     

如果您在加载jaxp.debug时遇到问题,请尝试:

     

DocumentBuilders

尝试通过为单元测试设置java -Djaxp.debug=1 YourProgram ....系统属性来切换到标准SAX解析器(例如Apache Xerces):

javax.xml.parsers.SAXParserFactory