在 Kotlin 中从 Spring 配置创建列表映射

Posted

技术标签:

【中文标题】在 Kotlin 中从 Spring 配置创建列表映射【英文标题】:Create map of lists from Spring config in Kotlin 【发布时间】:2018-05-29 05:55:51 【问题描述】:

我正在尝试在用Kotlin 编写的Spring Boot 应用程序中创建Map<String, List<String>> 类型的对象。

我能够从配置创建地图,也能够从配置创建列表,但是当我尝试将两者结合起来时,出现以下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myConfiguration': Could not bind properties to MyConfiguration (prefix=, ignoreInvalidFields=false, ignoreUnknownFields=true, ignoreNestedProperties=false); nested exception is java.lang.NullPointerException

我的Configuration Object

@ConfigurationProperties
@Component
class MyConfiguration 
   var myNewMap: Map<String, List<String>>? = null

我的Configuration yml

---
myNewMap:
   firstKey:
     - 2
     - 4
   secondKey:
     - 2

这可能与 Spring 读取配置的方式有关吗?或者是用逗号分隔的字符串创建一个简单的 Map 并将其转换为我的应用程序中的列表的唯一方法?

Kotlin: 1.2.0 Spring Boot: 1.5.6.RELEASE

【问题讨论】:

【参考方案1】:

对于仍然有这个的人,@Component 接口对你没有帮助,你需要@ConstructorBinding

@ConstructorBinding
@ConfigurationProperties(prefix = "apiconfig")
class ApiConfiguration 
    var myNewMap: Map<String, List<String>>? = null

【讨论】:

【参考方案2】:

当地图位于推荐用于 Spring Boot 配置的“前缀”内时,它对我来说很好。

我的 yml:

apiconfig:
  myNewMap:
    firstKey:
      - 2
      - 4
    secondKey:
      - 2

和我的配置类:

@Component
@ConfigurationProperties(prefix = "apiconfig")
class ApiConfiguration 
    var myNewMap: Map<String, List<String>>? = null

使用类:

@RestController
class Apis(@Autowired private val apiConfiguration : ApiConfiguration) 
    @GetMapping("/test")
    fun test(): String 
        apiConfiguration.myNewMap
        return "test"
    

【讨论】:

以上是关于在 Kotlin 中从 Spring 配置创建列表映射的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin Spring boot @ConfigurationProperties 用于列表

无法在 spring-boot 应用程序中从 Consul 读取配置

在 Spring MVC 中从 Controller 显示视图(所有员工的列表)

如何在 Spring Boot 应用程序中从数据库表中填充实体

Kotlin进阶学习3

在 Spring Boot 中从命令行设置活动配置文件和配置位置