Как переопределить стандартные свойства весеннего загрузчика в файле application.properties? - PullRequest
1 голос
/ 16 января 2020

Я создал мультимодульный проект maven, который содержит модуль library (приложение для начальной загрузки с пружиной) и модуль application (приложение для загрузки с пружиной, включившее library в качестве зависимости).

Это это структура моего проекта:

.
├── 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

library /.../ 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
}

library /.../ spring.factories:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.application.LibraryService

library /.../ config / application.properties:

properties.name=library

application /.../ Application.kt

@SpringBootApplication
class Application

fun main(args: Array<String>) {
    runApplication<Application>(*args)
}

application / ... /ApplicationService.kt

@Service
class ApplicationService(private val libraryService: LibraryService) {
    fun call() = libraryService.name()
}

application /.../ application.properties

properties.name=application

Итак, у меня есть модуль library, где Я положил application.properties файл с параметром по умолчанию properties.name=library. Модуль library имеет класс Property, введенный в LibraryService. LibraryService имеет простой метод name(), который просто возвращает значение из свойства. У меня также есть модуль application, где я использую LibraryService в ApplicationService и вызываю функцию name(), но у меня есть модуль application.properties в application, где properties.name=application.

Я ожидаю, что application's properties.name=application переопределяет library's properties.name=library и ApplicationService::call должно возвращать значение application вместо значения по умолчанию library в properties.name в library module. Но этого не происходит. ApplicationService::call возвращает значение library.

Я создал простой тест junit для воспроизведения этого поведения ( ApplicationServiceTest.kt ):

@SpringBootTest
class ApplicationServiceTest {

    @Autowired
    lateinit var applicationService: ApplicationService

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

Он печатает library , Я хотел бы иметь следующее поведение: library имеет несколько определенных свойств по умолчанию, но я хочу иметь возможность переопределить некоторые из этих свойств в application. Как этого добиться?

исходный код: https://github.com/grolegor/maven-multi-module-spring-starter

1 Ответ

1 голос
/ 16 января 2020

Форма документации

4.2.3. Файлы свойств приложения SpringApplication загружает свойства из файлов application.properties в следующих местах и ​​добавляет их в Весенняя среда:

1 . Подкаталог A / config текущего каталога

2 . Текущий каталог

3 . Пакет classpath / config

4 . Путь к классу root

Список упорядочен по приоритету (свойства, определенные в местоположениях выше в списке, переопределяют те, которые определены в нижних местоположениях ).

Итак в вашем случае будет использоваться [library] config/application.properties, поскольку он имеет более высокий порядок, чем [application] application.properties.

Кроме того, вы не можете использовать application.properties дважды.

Просматривая ваш репозиторий, я бы предложил что вы удалите /config/application.properties из библиотечного модуля и предоставите значения по умолчанию в вашем Properties -классе

package com.application

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...