【问题标题】:Typesafe config - Null Pointer Exception类型安全配置 - 空指针异常
【发布时间】:2014-04-13 13:15:43
【问题描述】:

我正在为我的 Play/Scala/Akka 应用程序手动构建类路径,因此我可以使用 ScalaTest 运行程序在 CI 管道的不同阶段测试我的应用程序,而无需重新编译。但是,我收到以下错误:

java.lang.NullPointerException:
  at com.typesafe.config.impl.Parseable$ParseableResources.rawParseValue(Parseable.java:509)
  at com.typesafe.config.impl.Parseable$ParseableResources.rawParseValue(Parseable.java:492)
  at com.typesafe.config.impl.Parseable.parseValue(Parseable.java:171)
  at com.typesafe.config.impl.Parseable.parseValue(Parseable.java:165)
  at com.typesafe.config.impl.Parseable.parse(Parseable.java:204)
  at com.typesafe.config.impl.ConfigImpl$1.call(ConfigImpl.java:368)
  at com.typesafe.config.impl.ConfigImpl$1.call(ConfigImpl.java:365)
  at com.typesafe.config.impl.ConfigImpl$LoaderCache.getOrElseUpdate(ConfigImpl.java:58)
  at com.typesafe.config.impl.ConfigImpl.computeCachedConfig(ConfigImpl.java:86)
  at com.typesafe.config.impl.ConfigImpl.defaultReference(ConfigImpl.java:365)

这是我正在运行的命令:

/usr/lib/jvm/java-7-openjdk//bin/java -Xmx256M -Xms32M -Xbootclasspath/a:$BOOTCP -classpath '""' -Dscala.home=/usr/opt/scala -Dscala.usejavacp=true -jar /home/nick/repos/testrunnnertest/lib/scalatest.jar -R target/scala-2.10/test-classes -o 

$BOOTCP 的值是大量依赖项列表,包括应用程序 jar、.ivy2 中的依赖项以及包含配置文件的文件夹(/conf、/test/resources)。我从 Scala shell 脚本中复制了这个命令。我还使用了 $BOOTCP 的值作为 -classpath 的值,但我仍然遇到了同样的问题。

仅当我运行启动 Play Framework 测试服务器的验收测试时才会出现此问题。因此,在 /conf 中加载主应用程序配置而不是 /test/resources 配置似乎是在单元和集成测试顺利运行时加载的问题。

【问题讨论】:

    标签: java scala playframework scalatest typesafe-config


    【解决方案1】:

    很晚才提出这个问题,但你有想过吗?哪个类型安全配置版本在您的类路径中?

    master 上的第 509 行看起来不太正确:https://github.com/typesafehub/config/blob/master/config/src/main/java/com/typesafe/config/impl/Parseable.java#L509

    所以你可能有一个版本略有不同的来源。

    版本 1.0.2 第 509 行看起来可能更有可能:https://github.com/typesafehub/config/blob/v1.0.2/config/src/main/java/com/typesafe/config/impl/Parseable.java#L509

    我猜在那条线上类加载器很可能是空的?它应该来自该跟踪中的此处:https://github.com/typesafehub/config/blob/v1.0.2/config/src/main/java/com/typesafe/config/impl/ConfigImpl.java#L365 又来自:https://github.com/typesafehub/config/blob/v1.0.2/config/src/main/java/com/typesafe/config/ConfigFactory.java#L380

    因此,一种理论是线程在抛出异常的情况下没有设置上下文类加载器。我无法告诉你为什么在你的场景中是这样的,如果是的话,但也许它是一个线索。

    我认为 typesafe 配置无论如何都不应该把 NPE 扔到这么晚,所以我创建了https://github.com/typesafehub/config/issues/155 来解决这个问题。然而,它很可能最终是一个问题和/或您如何设置线程上下文类加载器为空并且没有为 ConfigFactory 方法提供其他类加载器。

    这是假设 NPE 来自一个空类加载器,我认为这不一定是问题所在,但从堆栈跟踪来看似乎是合理的。

    【讨论】:

      猜你喜欢
      • 2012-07-07
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 2015-07-12
      相关资源
      最近更新 更多