Джава.Весна.Как зарегистрировать собственное свойство class-name - PullRequest
0 голосов
/ 01 марта 2019

Я уже несколько дней ищу способ определения в своем классе свойств (который аннотирован как @ConfigurationProperties) строкового свойства, которое будет именем класса, реализующего указанный интерфейс.Как Spring.datasource.driver-class-name.

Если ваш код содержит реализацию java.sql.Driver (или у вас есть несколько зависимостей с impls), то когда вы редактируете файл application.properties, идея помогает вамвыберите драйвер из списка реализаций

Я хочу то же самое.

Я положил завершенный проект здесь: https://github.com/ibelozor/test-spring-properties (kotlin, gradle)

я определяю службу:

interface MyService {
    fun doSomething()
}

, реализация [s]:

class ServiceAImpl: MyService {
    override fun doSomething()  {
        println("Do something implementation from ${this.javaClass.name}")
    }
}

, свойства:

/**
 * Service properties
 */
@Component
@ConfigurationProperties(prefix = "service")
data class MyServiceProps (
        /**
         * Device driver class name
         */
        var className: String = "ru.ibelozor.test.classname.DefaultServiceImpl"
) {
        fun getService(): MyService {
                val serviceClass = Class.forName(className)
                return MyService::class.java.cast(serviceClass.newInstance())
        }
}

, поэтому я могу использовать свой сервис в качестве компонента (и это прекрасно работает):

@Configuration
class TestConfig
@Autowired constructor(private val props: MyServiceProps) {
    @Bean
    fun getMyService(): MyService {
        return props.getService()
    }
}

Но я хочу, чтобы эта идея предложила мне реализации моего интерфейса при редактировании файла application.properties
case из spring.datasource.driver-class-name: case of spring.datasource.driver-class-name

мой случай - service.class-name = ... Нет предложений: my case - service.class-name=... No suggestions

...