我正在尝试从Play框架中的配置文件中检索服务器列表。目前我有以下代码:
val servers: List[Server] = {
val servers = ConfigFactory.load().getConfigList("servers") map { s =>
Server(s.getString("ip"), s.getString("port")) }
servers.toList
}
配置文件中不存在"servers"
时出现问题。在这种情况下,ConfigFactory.load().getConfigList("servers") == null
,map
操作会导致NullPointerException
。一个简单的解决方法是存储ConfigFactory.load().getConfigList("servers")
的结果,并对其结果进行分支。
这种方法对我来说并不像惯用语。如果前面的表达式不是map
?
null
答案 0 :(得分:2)
看起来您正在使用Java API for Play。
play.api.Play.application.configuration.getConfigList
会调用def
getConfigList(path: String): Option[List[Configuration]]
然后您可以在
server_list = ConfigFactory.load()。getConfigList(“servers”)。getOrElse(List())
请注意,play.api.Play.application
已弃用。正如OP所指出的,检索此值的新代码应为server_list = ConfigFactory.load().getConfigList("servers")
答案 1 :(得分:0)
我现在要加上这个。
import com.typesafe.config.ConfigFactory
//...
val server_list = ConfigFactory.load().getConfigList("servers")
val servers: List[Server] = server_list match {
case null => List[Server]()
case _ => val servers = server_list map { s =>
Server(s.getString("ip"), s.getString("port")) }
servers.toList
}
答案 2 :(得分:0)
也许你可以尝试围绕第一个电话包装一个选项:
val server_list = Option(play.Play.application().configuration().getConfigList("servers"))
这应该返回None而不是null。然后你可以使用.getOrElse(List.empty).map ...