我没有完整的解决方案,但我会分享我所知道的。
ServletContext 提供了可以在应用程序之外设置的init 参数。然后 servlet 容器使它们可用于应用程序/上下文。返回这些参数的方法称为initParameterNames()。
例如,假设我正在使用 Tomcat 8 运行应用程序,并且该应用程序名为 example-app。要设置一些 init parameters 我会创建文件 $CATALINA_BASE/conf/Catalina/localhost/example-app.xml
在文件中,我会像这样保存我的参数:
<Context>
<Parameter name="environments.production.dataSource.url" value="jdbc:h2:anotherProdDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE" override="true" />
</Context>
通过 Grails,我可以从 ServletContext 访问该值。例如,从 GSP 中,我可以读取如下值:
application.getInitParameter('environments.production.dataSource.url')
理想情况下,我会在启动过程的早期将 init 参数 与 Grails 配置 (grailsApplication.config) 合并,以便 init 参数 覆盖 Grails 配置。但我不知道该怎么做。可以从 GrailsAutoConfiguration 访问 Grails 配置(并且显然可以修改),如下所示:
import grails.boot.GrailsApp
import grails.boot.config.GrailsAutoConfiguration
import grails.boot.config.GrailsApplicationPostProcessor
import grails.core.GrailsApplication
class Application extends GrailsAutoConfiguration {
static void main(String[] args) {
GrailsApp.run(Application, args)
}
GrailsApplicationPostProcessor grailsApplicationPostProcessor() {
def processor = super.grailsApplicationPostProcessor()
processor.grailsApplication.config.setAt('environments.production.dataSource.url', 'testing...')
return processor
}
}
但我不知道如何访问 grailsApplicationPostProcessor() 中的 ServletContext 以便使用 init 参数覆盖 Grails 配置。