当前位置: 首页 > 知识库问答 >
问题:

具有不可变属性的绑定不适用于Spring Boot静态编程语言@ConfigurationProperties中的@Value

有耀
2023-03-14

Spring Boot支持用于@ConfigurationProperties的Kotlin数据类。

@ConstructorBinding
@ConfigurationProperties(prefix = "prefix")
data class AppProperties (
    val something: String
)

但是val@ConstructorBind有一些限制。不能将一个变量化名为另一个变量。假设您在库伯内特斯运行,并希望捕获主机名,该主机名由env varHOSTNAME给出。最简单的方法是将@Value("\${HOSTNAME}:)"应用到属性,但它只适用于可变属性,没有构造函数绑定。

Spring Boot GitHub问题跟踪器表示:

停止请询问有关如何使用Spring Boot标记在堆栈溢出上使用某些东西的问题,或者了解为什么某些东西不能按预期工作。

那么,这是一个已知的限制,还是我应该为他们创建一张罚单来修复它?

编辑:打开https://github.com/spring-projects/spring-boot/issues/25552


共有1个答案

富波光
2023-03-14
匿名用户

@ConfigurationProperties@Value的替代品,二者并非设计为一起使用。它可以与JavaBean风格的绑定一起工作,但这是偶然的,而不是设计的,不应该依赖它。

与使用@Value来别名通过@ConfigurationProperties绑定的内容不同,建议您通过其他方式进行别名绑定。例如,您可以使用Marcos Barbero在对您的问题的评论中链接到的回答中建议的方法之一。或者,您可以从文档中的这个示例中获得一些灵感,并在应用程序中使用占位符。属性

prefix.something=${hostname}

另一个选择是通过META-INF/spring注册。工厂一种环境后处理器的实现,它向环境中添加一个属性源,以设置所需的别名。目前,如果您想在可重用库中执行某些操作,这可能是最好的方法。有一个悬而未决的问题,以消除一些仪式,目前涉及。

 类似资料:
  • 我想通过使用@ConfigurationProperties注释将我的Application.Properties自动绑定到一个类中。首先,我尝试了@value注释,并能够将属性值注入类变量。但是,@ConfigurationProperties没有将属性注入到值中。 我的应用程序.属性: application.java ConfigBinder.java 输出: 这样的执行到底出了什么问题?

  • 我有一个Spring自动配置库,我是Swagger的开发者。它是使用Spring Boot用Kotlin编写的。 我的主要自动配置定义为: 我有几个类,见下面的主类,它们作为bean使用注入到上面的类中。我想使用新的从我的主自动配置类中删除丑陋的。 源代码存储在我的GitHub回购https://github.com/opengoodio/swagger-auto-configuration. 主

  • 我有一个带有环境变量的外部属性源(比如一个. properties文件),如下所示: 我想用这些初始化一个< code > @ configuration properties : 当我在应用程序开始时将这些设置为环境变量时,一切都很好。但是,当我在

  • 是否有可能在Kotlin 属性初始化之前从其获取< code>::class.java? 从逻辑上讲,它应该可以工作——我试图获取一个类而不是一个值,但实际上它在未初始化的属性访问异常时失败。 请注意,我试图获取类的属性位于泛型类中,其类型是泛型参数之一: 我需要这个类来创建的实例 当然,我不能做到: 对此有什么解决办法吗?

  • 我是Kotlin的初学者,我实际上正在Kotlin中做一个Androïd应用程序。我必须初始化一些值未知的属性(它不是,但从现在开始很难定义),所以我想像在TypeScript中一样,例如:这意味着startDate的类型可以是任何东西(它不受保护,但它有助于获得值,而不是关于发生了什么)。 有没有办法在科特林做到这一点?我试过了或者如列表中的* 感谢您的阅读!

  • 上周我更新了Kotlin 1.5,昨天看到谷歌打算让Jetpack成为设计UI的首选选项后,我想做一些测试。 问题是将我的项目更新为静态编程语言1.5,当尝试构建项目时,我得到以下错误: 静态编程语言1.5与Jetpack Compose不兼容吗?在谷歌搜索问题后,我找到了版本,其中提到了Jetpack Compose,但不是以“不兼容”的方式。 你对此有任何答案吗?我应该使用吗?在这种情况下,我