scala - scala加载配置地图地图
问题描述
我需要从配置文件中读取并将配置映射到案例类。如果我有一个如下表,它可以正常工作
配置
mapping {
target {
oracle = {
type = "oracle"
schema = "orcl"
tableName = "my_table"
query = "select key from my_table where dob='2020-01-01'
}
}
SCALA 代码片段
val targetConfig:Map[String,QueryEngine] = config.getObject("mapping.target")
.entrySet()
.asScala
.foldLeft(Map.empty[String , QueryEngine]) { case ( acc , entry ) =>
val target = entry.getKey
val targetConfig = entry.getValue match {
case validElement if validElement.valueType() == ConfigValueType.OBJECT => validElement.asInstanceOf[ConfigObject].toConfig
case invalidElement => sys.error("illegal syntax at $invalidElement")
}
targetConfig.getString("type") match {
case "oracle" => acc + (target -> new OracleQueryEngine(vars,target,targetConfig.getString("schema"),targetConfig.getString("tableName"),targetConfig.getString("query"),targetConfig.getString("param")))
case x => sys.error(s"unknow target not defined $targetConfig with $targetConfig")
}
}
现在我用目标映射中的多个表更新了 CONFIG。
mapping {
target {
oracle =
emp = {
type = "oracle"
schema = "orcl"
tableName = "emp"
query = "select key from emp where dob='2020-01-01'
}
dept = {
type = "oracle"
schema = "orcl"
tableName = "dept"
query = "select key from dept where dob='2020-01-01'
}
}
}
多表场景的代码片段
This is giving error
Error:(22, 28) type mismatch;
found : scala.collection.mutable.Buffer[scala.collection.immutable.Map[String,QueryEngine]]
required: scala.collection.immutable.Map[String,QueryEngine]
objs.asScala.map { obj =>
代码片段
val sourcesConfig: Map[String, QueryEngine] =
config.getObject("mapping.target")
.entrySet()
.asScala
.foldLeft(Map.empty[String, QueryEngine]) { case (acc, entry) =>
val source = entry.getKey
entry.getValue match {
case objs:ConfigList =>
objs.asScala.map { obj =>
val sourceConfig = obj.asInstanceOf[ConfigObject].toConfig
sourceConfig.getString("type") match {
case "oracle" => acc + (source -> new OracleQueryEngine(vars,source,sourceConfig.getString("schema"), sourceConfig.getString("tableName"), sourceConfig.getString("query"), sourceConfig.getString("param")))
case x => sys.error(s"unknown source not defined $source with $sourceConfig")
}
}
}
解决方案
将“oracle”包裹在大括号中,因为它是JsObject
:
mapping {
target {
oracle = {
emp = {
type = "oracle"
schema = "orcl"
tableName = "emp"
query = "select key from emp where dob='2020-01-01'
}
dept = {
type = "oracle"
schema = "orcl"
tableName = "dept"
query = "select key from dept where dob='2020-01-01'
}
}}
}
它现在有效吗?
如果不使用例如PureConfig。
您的解决方案可以像这样简单:
import pureconfig._
import pureconfig.generic.auto._
case class Mappings(mapping: Mapping)
case class Mapping(target: Oracle)
case class Oracle(oracle: Map[String, Map[String, String]])
ConfigSource.default.load[Mappings]
推荐阅读
- spring-data-mongodb - 何时使用 MongoOperations 和 MongoTemplate?
- ruby - 使用 youtube api,如何在 ruby 中上传私人视频?
- java - Kafka Stream 和 KGlobalTable Join 问题
- oracle - 在 Oracle 11g 中使用 ORACLE“FOR UPDATE SKIP LOCKED”选择非锁定行
- r - 为什么我们在向量中省略 NULL 值而不是用 0 替换?
- php - 如何访问 JSON 的某些部分?
- bash - 如何使用 bash 管道保留除第一个令牌之外的所有内容?
- python - 从烧瓶中的表单获取数据的问题
- python - 如何在 python 中生成 JWT 断言
- spring-batch - SQL [SELECT * FROM AH_PATIENT] 的未分类 SQLException;SQL状态[60000];错误代码[604];ORA-00604: 递归 SQL 级别 1 发生错误