【问题标题】:Grails Integration with another Spring app - dataSource being overloadedGrails 与另一个 Spring 应用程序集成 - 数据源被重载
【发布时间】:2010-12-19 10:42:42
【问题描述】:

我目前正在为现有的基于 Spring 的应用程序构建 CRUD 工具。 该应用程序作为 JAR 库包含在 Grails 应用程序中,看起来运行良好。

为了利用库自己的spring上下文,我曾经通过以下方式加载它:

def ctx = new ClassPathXmlApplicationContext( 'classpath:/applicationContextName.xml')

为我服务。不幸的是,上下文构建了自己的数据源(库的默认值),这并不好,因为我需要使用 Grails 中定义的数据源。

因此,我的解决方案是通过将导入添加到 grails-app\conf\spring\resources.xml 文件中,将库的 spring 配置与 Grails 上下文一起包含。

这似乎可行(因为所有 bean 都加载到相同的上下文中,我现在可以使用 def variableName 将 bean 直接自动装配到我的服务类中。

不幸的是,库的 spring 配置中定义的数据源正在重载我的 Grails DataSource.groovy 文件中定义的数据源!

有什么方法可以告诉 Grails 先加载库的 spring 配置,然后它会被 Grails 配置的其余部分覆盖(从而使用 Grails 的 DataSource)?

感谢您的帮助,

詹姆斯

...

作为临时措施,我已经删除了依赖项的 spring 配置文件中的 dataSource 条目,并且它的 bean 已经注入了由 Grails 配置创建的 dataSource ——但这并不理想,因为我必须创建一个依赖 jar 的“特殊”构建。

【问题讨论】:

    标签: java spring configuration grails dependency-injection


    【解决方案1】:

    我会考虑制作一个包含您的库的简单插件,并在 dataSources 插件之前加载它(在您的 *Plugin.groovy 文件中使用 def loadBefore = ['datasources'])。

    每个插件都有一个 doWithSpring 钩子,可让您将 bean 添加到上下文中(您可以在其中包含现有的 context.xml)。

    作为一个额外的好处,它将使下次重新使用该库变得更加容易:)

    干杯

    李

    【讨论】:

    • 好答案!我相信这会很好地解决这个问题。我不再有两个数据源(我删除了依赖关系并重新编码了我需要的位),所以很遗憾我无法对此进行测试。
    【解决方案2】:

    更简单的解决方案是在 Grails 上下文 (resources.xml) 中导入应用程序的上下文,然后有两个选项。您可以将应用程序的数据源重命名为与 Grails 不同的名称,或者您可以从应用程序中删除数据源并使用 Grails 部分 Grails 之一。 解决方案的区别在于两个数据源是否连接到同一个数据库。

    【讨论】:

    • 有两个数据源,因为当时我需要连接到两个不同的数据库。临时解决方案是您建议的 - 来自依赖项的数据源的名称与 grails 中定义的数据源不同,它允许我拥有 2 个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    相关资源
    最近更新 更多