Scala动态字符串插值 - 从属性文件中读取

时间:2017-11-16 12:26:42

标签: string scala slf4j

我尝试从message.properties获取日志消息,并使用该日志消息进行字符串插值。此时,日志消息未使用原始消息进行插值。

我无法获得字符串插值结果并将输出作为日志消息获取我在属性文件中指定的内容

这里我不想硬编码scala文件中的任何日志消息,而不是这样,我想从属性文件中获取所有消息,并在插入字符串值后重定向到应用程序日志。

import com.typesafe.config.ConfigFactory
import grizzled.slf4j.Logging
object Test extends Logging {
  def main(args: Array[String]){
    val subjectArea="Member"
    val  messageProp = ConfigFactory.load("message.properties")
    val log=messageProp.getString("log.subject.area")
    debug(s"$log")
  }
}

message.properties
log.subject.area=The Subject Area : $subjectArea

控制台输出:主题区域:$ subjectArea 我想要输出:主题领域:会员

提前致谢!!! Test.scala message.propeties

2 个答案:

答案 0 :(得分:1)

这不是字符串插值问题。你想要一个轻量级的模板引擎(例如http://jtwig.org/documentation/quick-start/application或其他)。如果您的问题与您提供的代码段一样简单,我觉得他们中的大多数都会有些过分。

如果你想做一些或多或少复杂的事情,那么请确保使用模板引擎。

否则,我只是使用字符串替换。

答案 1 :(得分:0)

字符串插值仅适用于常量。要动态地执行您想要的操作,您需要编写一些显式处理yoruself(或使用模板引擎库)。也许是这样的事情?

 val substPattern = """\$\{(.+?)\}""".r
 import java.util.regex.Matcher.{ quoteReplacement => qq }
 def processSubstitutions(
   input: String, 
   vars: Map[String, String]
 ) = substPattern.replaceAllIn(
     input, { m => 
       val ref = m.group(1)
       qq(vars.getOrElse(ref, ref)
     }
 )

 val vars = Map("subjectArea" -> "Member")
 val  messageProp = ConfigFactory.load("message.properties")
 val log=processSubstitutions(
    messageProp.getString("log.subject.area"),
    vars
 )