Комментарии 19
Пишу конфиги на котлин скрипте, по большому счету принцип тот же что в груви, только есть автодополнение и нет methodMissing:
config {
jetty {
httpConnector {
port = 4242
host = "0.0.0.0"
}
}
}
Можно еще вспонить проект https://github.com/gradle/kotlin-dsl для gradle который приносит те же прелести нормального тулинга
У нас ещё была причина на груви писать- тогда котлин ещё не поддерживал DSL (появилось в 1.1.1)- но сейчас груви не нужен.
methodMissing — нет и я не понимаю зачем это надо. Мы ж хотим бины- зачем делать свалку, куда попадёт куча мусора? нужно лишь описать классы с полями- и всё.
А аннотация с лямбдой- это о чём?
class HttpConnector(var port: Int? = null, var host: String? = null)
class JettyBuilder {
fun httpConnector(f: HttpConnector.() -> Unit): Unit = TODO()
}
class ConfigBuilder {
fun jetty(f: JettyBuilder.() -> Unit): Unit = TODO()
}
fun config(f: ConfigBuilder.() -> Unit): Unit = TODO()
тогда котлин ещё не поддерживал DSL (появилось в 1.1.1)
А поясните пожалуйста. kotlin dsl — это экстеншн лямбды и возможность писать лямбду-последний аргумент «за пределами вызова функции» как блок кода. Обе эти штуки были с релиза.
Может, для этого уже есть библиотека?
Да полно. Вот очень неплохой вариант: http://owner.aeonbits.org/.
Для себя я уже давно решил проблему конфигов: использую стандартный JAXB. Структура описывается прямо в бинах при помощи парочки аннотаций. Все сериализуется в XML. Maven автоматически генерит XSD, который понимает IDE и позволяет делать autocomplete при редактировании конфига.
Не совсем понял, что вы имеете ввиду под "наследованием" конфигов. Если это наследование бинов, то у JAXB с этим проблем нет. А если дефолтные значения для полей, то их можно указывать прямо при описании самих полей:
public class DatabaseConfig {
public String url = "jdbc:h2:mem:test";
public String username = "sa";
public String password = "";
}
Дык, захардкодьте весь дефолтный конфиг значениями прямо в бинах, как я показал выше. А в xml нужно будет прописывать только элементы, значения которых отличаются. JAXB будет создавать объект с дефолтными параметрами, и перезаписывать только поля, указанные в xml. В идеале с пустым xml будет создаваться полный дефолтный конфиг.
Если у вас есть кложур с делегатом, выставляйте аннотацию DelegatesTo, тогда ваш DSL будет подерживать систему типов, автокомплит, и статическую компиляцию
Использование возможностей Groovy DSL для конфигурации Java-приложения