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

如何在application.properties文件中覆盖spring boot Starter的默认属性?

易奇希
2023-03-14
.
├── application
│   ├── pom.xml
│   └── src
│       ├── main
│       │   ├── kotlin
│       │   │   └── com
│       │   │       └── application
│       │   │           ├── ApplicationService.kt
│       │   │           └── Application.kt
│       │   └── resources
│       │       └── application.properties
│       └── test
│           └── kotlin
│               └── com
│                   └── application
│                       └── ApplicationServiceTest.kt
├── library
│   ├── pom.xml
│   └── src
│       └── main
│           ├── kotlin
│           │   └── com
│           │       └── application
│           │           ├── LibraryService.kt
│           │           └── Properties.kt
│           └── resources
│               ├── META-INF
│               │   └── spring.factories
│               └── config
│                   └── application.properties
└── pom.xml

库/.../properties.kt:

@ConfigurationProperties("properties")
class Properties {
    lateinit var name: String
}

Library/.../LibraryService.kt:

@Service
@EnableConfigurationProperties(Properties::class)
class LibraryService(private val properties: Properties) {
    fun name() = properties.name
}

图书馆/.../Spring。工厂:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.application.LibraryService
properties.name=library
@SpringBootApplication
class Application

fun main(args: Array<String>) {
    runApplication<Application>(*args)
}
@Service
class ApplicationService(private val libraryService: LibraryService) {
    fun call() = libraryService.name()
}
properties.name=application

我认为应用程序的properties.name=application重写库的applicationService::Call必须返回application,而不是库模块properties.name中的默认值Library。但这不会发生。ApplicationService::Call返回值Library

我创建了简单的junit测试来重现这种行为(applicationServiceTest.kt):

@SpringBootTest
class ApplicationServiceTest {

    @Autowired
    lateinit var applicationService: ApplicationService

    @Test
    fun test() {
        println(applicationService.call())
    }
}

它打印。我希望具有以下行为:具有一些已定义的默认属性,但我希望能够在应用程序中重写其中一些属性。如何实现?

源代码:https://github.com/grolegor/maven-multi-module-spring-starter


共有1个答案

宰父德馨
2023-03-14

形成文档

4.2.3.应用程序属性文件SpringApplication在以下位置从Application.properties文件中加载属性,并将其添加到Spring环境中:

1.当前目录的/config子目录

因此,在您的示例中,将使用[library]config/application.properties,因为它的顺序比[application]application.properties高。

此外,您不能使用application.properties两次。

查看您的存储库,我建议您从库模块中删除/config/application.properties,并在properties-class中提供默认值

package com.application

import org.springframework.boot.context.properties.ConfigurationProperties

@ConfigurationProperties("properties")
class Properties {
    var name: String = "library"
}

 类似资料:
  • 本文向大家介绍如何覆盖Spring Boot项目的默认属性?相关面试题,主要包含被问及如何覆盖Spring Boot项目的默认属性?时的应答技巧和注意事项,需要的朋友参考一下 这可以通过在application.properties文件中指定属性来完成。 例如,在Spring MVC应用程序中,您必须指定后缀和前缀。这可以通过在application.properties文件中输入下面提到的属性来

  • 我有一个RESTAPI,我不想强迫客户端发送请求参数。我有将近400个api方法,我不想将所有参数设置为“required=false” 我想覆盖Spring RequestParam的默认行为。我想将RequestParam接口的“required”属性的默认值设置为“false”。 有什么方法可以覆盖它吗?如果我不能或这不是最佳实践,有什么方法可以解决上述问题。

  • 我需要定制的工件安装,不知道如何覆盖默认的(从默认的maven生命周期)。所以我的问题是: 如何在我的pom.xml中配置maven install插件,使其不进行默认安装并执行我的自定义安装文件目标? 我尝试了没有id和默认安装id,但没有帮助。 更新:从提供的答案 - 这对我不起作用(我在日志中看到两次安装尝试)。

  • 文件已经存在,您可以覆盖它 (“是”按钮),跳过 (“否”按钮),重命名,全部重命名 ,覆盖全部文件 (“全部皆是” 按钮),跳过全部已存在的文件 (“全部皆否”按钮) 或取消 当前的操作。 如果您选择了全部重命名 模式,重命名文件将得到象 'filename(N).txt' 的名字,'filename.txt' 的位置是原始的文件名, 'N' 是数字。

  • 并且,对于不同的目标服务器,目标路径每次都将不同! 清洁/家居对我来说不是一个选择。不幸的是,这里的答案对我来说不是很清楚。

  • 我有一个bean,它使用@value注释填充属性,如下所示 在我的应用程序上下文中,我有以下配置 当values.properties文件不存在时,默认值“none”会按预期设置,但是当属性文件存在时,默认值仍会使用,即使我收到一条日志消息,说明属性文件是从PropertyPlaceholderConfigurer加载的 只有当属性文件丢失和/或占位符不可解析时,我才需要默认值生效;不是一直都是。