在 Ratpack 中,如何配置从外部文件加载配置?
In Ratpack, how can I configure loading configuration from an external file?
我有一个用 Groovy DSL 编写的 Ratpack 应用程序。 (嵌入 Java,因此不是脚本。)
我想从命令行选项中提供的配置文件加载服务器的 SSL 证书。 (证书将直接嵌入到配置中,或者可能嵌入到配置中某处引用的 PEM 文件中。)
例如:
java -jar httpd.jar /etc/app/sslConfig.yml
sslConfig.yml:
---
ssl:
privateKey: file:///etc/app/privateKey.pem
certChain: file:///etc/app/certChain.pem
我似乎在使用 serverConfig
的工具读取配置文件以便稍后在 serverConfig
中配置 SslContext
时遇到先有鸡还是先有蛋的问题。服务器配置未在我要加载 SslContext 时创建。
为了说明,我的 DSL 定义是这样的:
// SSL Config POJO definition
class SslConfig {
String privateKey
String certChain
SslContext build() { /* ... */ }
}
// ... other declarations here...
Path configPath = Paths.get(args[1]) // get this path from the CLI options
ratpack {
serverConfig {
yaml "/defaultConfig.yaml" // Defaults defined in this resource
yaml configPath // The user-supplied config file
env()
sysProps('genset-server')
require("/ssl", SslConfig) // Map the config to a POJO
ssl sslConfig // HOW DO I GET AN INSTANCE OF that SslConfig POJO HERE?
baseDir BaseDir.find()
}
handlers {
get { // ...
}
}
}
可能有解决方案(在稍后的块中加载 SSL 上下文?)
或者可能只是解决整个问题的更好方法..?
您可以创建一个单独的 ConfigDataBuilder
来加载配置对象以反序列化您的 ssl 配置。
或者,您可以直接绑定到 server.ssl
。所有 ServerConfig
属性都绑定到配置中的 server
space。
我目前使用的解决方案是,在 SslConfig
中添加 #builder
方法,其中 returns 和 SslContextBuilder
使用其其他字段定义。
ratpack {
serverConfig {
// Defaults defined in this resource
yaml RatpackEntryPoint.getResource("/defaultConfig.yaml")
// Optionally load the config path passed via the configFile parameter (if not null)
switch (configPath) {
case ~/.*[.]ya?ml/: yaml configPath; break
case ~/.*[.]json/: json configPath; break
case ~/.*[.]properties/: props configPath; break
}
env()
sysProps('genset-server')
require("/ssl", SslConfig) // Map the config to a POJO
baseDir BaseDir.find()
// This is the important change.
// It apparently needs to come last, because it prevents
// later config directives working without errors
ssl build().getAsConfigObject('/ssl',SslConfig).object.builder().build()
}
handlers {
get { // ...
}
}
}
本质上,这会执行 ServerConfig
的额外构建,以重新定义第二个构建的输入,但它有效。
我有一个用 Groovy DSL 编写的 Ratpack 应用程序。 (嵌入 Java,因此不是脚本。)
我想从命令行选项中提供的配置文件加载服务器的 SSL 证书。 (证书将直接嵌入到配置中,或者可能嵌入到配置中某处引用的 PEM 文件中。)
例如:
java -jar httpd.jar /etc/app/sslConfig.yml
sslConfig.yml:
---
ssl:
privateKey: file:///etc/app/privateKey.pem
certChain: file:///etc/app/certChain.pem
我似乎在使用 serverConfig
的工具读取配置文件以便稍后在 serverConfig
中配置 SslContext
时遇到先有鸡还是先有蛋的问题。服务器配置未在我要加载 SslContext 时创建。
为了说明,我的 DSL 定义是这样的:
// SSL Config POJO definition
class SslConfig {
String privateKey
String certChain
SslContext build() { /* ... */ }
}
// ... other declarations here...
Path configPath = Paths.get(args[1]) // get this path from the CLI options
ratpack {
serverConfig {
yaml "/defaultConfig.yaml" // Defaults defined in this resource
yaml configPath // The user-supplied config file
env()
sysProps('genset-server')
require("/ssl", SslConfig) // Map the config to a POJO
ssl sslConfig // HOW DO I GET AN INSTANCE OF that SslConfig POJO HERE?
baseDir BaseDir.find()
}
handlers {
get { // ...
}
}
}
可能有解决方案(在稍后的块中加载 SSL 上下文?)
或者可能只是解决整个问题的更好方法..?
您可以创建一个单独的 ConfigDataBuilder
来加载配置对象以反序列化您的 ssl 配置。
或者,您可以直接绑定到 server.ssl
。所有 ServerConfig
属性都绑定到配置中的 server
space。
我目前使用的解决方案是,在 SslConfig
中添加 #builder
方法,其中 returns 和 SslContextBuilder
使用其其他字段定义。
ratpack {
serverConfig {
// Defaults defined in this resource
yaml RatpackEntryPoint.getResource("/defaultConfig.yaml")
// Optionally load the config path passed via the configFile parameter (if not null)
switch (configPath) {
case ~/.*[.]ya?ml/: yaml configPath; break
case ~/.*[.]json/: json configPath; break
case ~/.*[.]properties/: props configPath; break
}
env()
sysProps('genset-server')
require("/ssl", SslConfig) // Map the config to a POJO
baseDir BaseDir.find()
// This is the important change.
// It apparently needs to come last, because it prevents
// later config directives working without errors
ssl build().getAsConfigObject('/ssl',SslConfig).object.builder().build()
}
handlers {
get { // ...
}
}
}
本质上,这会执行 ServerConfig
的额外构建,以重新定义第二个构建的输入,但它有效。