【问题标题】:Reading Spring Boot ConfigurationProperties with Scala使用 Scala 读取 Spring Boot ConfigurationProperties
【发布时间】:2017-05-06 22:26:03
【问题描述】:

我在 Scala 中使用 Spring Boot。我想通过 @ConfigurationProperties 注释读取具有 Scala 类型的案例类的属性。我已经知道我将无法注释 Scala 案例类,因为 Spring Boot 不支持基于构造的属性注入。但至少我想将集合(列表和地图)从配置映射到基于 Scala 的类型。这样我就可以编写一个配置类:

@Component
@ConfigurationProperties("kafka")
case class KafkaConfig() {
  @BeanProperty
  var bootstrapServers: List[String] = _

}

然后像这样写一个配置文件application.yml:

kafka:
  bootstrapServers:
    - "node1:9092"
    - "node2:9092"

这可能吗?在这种情况下,我尝试使用转换器,如下所示:

import org.springframework.core.convert.converter.Converter
import scala.collection.JavaConverters._

@Component
@ConfigurationPropertiesBinding
class JavaListToList extends Converter[java.util.List[Any], List[Any]] {
  override def convert(s: java.util.List[Any]): List[Any] = {
    s.asScala.toList
  }
}

但这不起作用,因为 Spring 尝试不转换已读取的 (java) 列表,而是实例化一个空的 Scala 列表并附加到它。所以我肯定在这里走错路了。

我将不胜感激。

【问题讨论】:

  • 你收到过这个吗?

标签: scala spring-boot


【解决方案1】:
import java.util.{List => JList, ArrayList => JArrayList}

@Configuration
@ConfigurationProperties("kafka")
class AppConfig {

 @BeanProperty
 var bootstrapServers: JList[String] = new JArrayList[String]

 def getBootStrapServer: JList[String]  = bootstrapServers
}

import java.util.{List => JList, ArrayList => JArrayList}

@Component
@ConfigurationProperties(prefix = "kafka")
class KafkaConfig {

 @BeanProperty
 var bootstrapServers: JList[String] = new JArrayList[String]

 def getBootStrapServer: JList[String]  = bootstrapServers
}

【讨论】:

  • 需要使用Java List/Map,不要使用Scala List
猜你喜欢
  • 2016-01-26
  • 2021-11-22
  • 2019-11-22
  • 1970-01-01
  • 2017-11-06
  • 2015-06-17
  • 2018-02-07
  • 2016-07-24
  • 1970-01-01
相关资源
最近更新 更多