【问题标题】:Move Spring XML context to Groovy将 Spring XML 上下文移动到 Groovy
【发布时间】:2014-12-23 00:09:18
【问题描述】:

我正在尝试将我的简单 Spring 集成应用程序从 XML 上下文移动到 Groovy 上下文。不幸的是,找不到任何有用的示例如何在 Groovy 上下文中使用命名空间。我从最简单的部分开始,用 MQ 绑定的入站网关:

<bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
    <property name="connectionFactory">
        <bean class="org.apache.activemq.ActiveMQConnectionFactory">
            <property name="brokerURL" value="<brokerUrl>"/>
        </bean>
    </property>
</bean>

<int:channel id="plainRequestChannel"/>
<int:channel id="errorChannel"/>
<int:channel id="plainReplyChannel"/>

<int-jms:inbound-gateway id="gateway" request-destination-name="QUEUE.IN"
                         default-reply-queue-name="QUEUE.OUT"
                         request-channel="plainRequestChannel"
                         error-channel="errorChannel"
                         reply-channel="plainReplyChannel"
                         connection-factory="jmsFactory"/>

我的 Groovy 等价于这个上下文(不起作用):

package spring4

import org.apache.activemq.jms.pool.PooledConnectionFactory
import org.apache.activemq.spring.ActiveMQConnectionFactory;

beans {
    xmlns intjms:"http://www.springframework.org/schema/integration/jms"
    xmlns integration:"http://www.springframework.org/schema/integration"

    amqConnectionFactory (ActiveMQConnectionFactory) {
        brokerURL = "<brokerUrl>"
    }

    jmsFactory (PooledConnectionFactory) {bean ->
        bean.destroyMethod = 'stop'
        connectionFactory = ref('amqConnectionFactory')
    }

    integration.channel(id:'plainRequestChannel')
    integration.channel(id:'plainReplyChannel')
    integration.channel(id:'errorChannel')

    intjms.'inbound-gateway'(
            id:"gateway",
            'request-destination-name': "QUEUE.IN",
            'default-reply-queueName': "QUEUE.OUT",
            'request-channel': ref('plainRequestChannel'),
            'error-channel': ref('errorChannel'),
            'reply-channel': ref('plainReplyChannel'),
            'connection-factory': ref('jmsFactory')
    )
}

正如我所提到的,它不起作用。错误:

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.jms.listener.DefaultMessageListenerContainer#0': Cannot resolve reference to bean '<jmsFactory>' while setting bean property 'connectionFactory'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named '<jmsFactory>' is defined
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1469)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:762)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
    at org.springframework.context.support.GenericGroovyApplicationContext.<init>(GenericGroovyApplicationContext.java:151)
    at my.pack.integration.SpringGroovyBootstraper.main(SpringGroovyBootstraper.java:14)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named '<jmsFactory>' is defined
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:694)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1157)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:280)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
    ... 19 more

请问,我做错了什么?另外,如果您向我推荐任何指向相关教程/示例/文档的链接,我将不胜感激

【问题讨论】:

  • 你在哪里使用它?在Grails 中有Spring BeanBuilder DSL
  • @injecteer 它是带有 Spring4 上下文的 Java 应用程序,我不使用 Grails
  • 那么为什么需要将上下文切换到 groovy?
  • @injecteer 说来话长:)我希望我的应用程序能够与外部系统的多个实例通信。这意味着我需要有几个gateway bean,但我不知道编译时到底有多少(它将使用属性文件进行配置)。所以我需要一些上下文中的非声明性逻辑。我想它仍然可以使用 XML 配置,但我想研究新的视野:)
  • 虽然,这里离题了,但我可以向你保证,切换到 Grails 给你带来的不仅仅是简化你的 XML 配置 :) 地狱,甚至只包含 groovy(或任何其他动态 JVM 语言) 到您的项目中会大大提高您的工作效率

标签: java spring groovy spring-integration spring-4


【解决方案1】:

你看过groovy dsl吗?

它最近没有太多活动,但它可能会给你一些指示(它有一个 JMS 模块)。

您可能还想查看新的(积极维护的)Java DSL

【讨论】:

  • 是的,我检查了 Groovy dsl - 它没有 jdbc 网关,所以很遗憾,它对我不起作用。 Java DSL 看起来更有趣,我试试,谢谢。
【解决方案2】:

嗯,这个特殊的问题已经解决了:我刚刚删除了ref。所以我的上下文现在看起来像这样:

package spring4

import org.apache.activemq.jms.pool.PooledConnectionFactory
import org.apache.activemq.spring.ActiveMQConnectionFactory;

beans {
    //importBeans("classpath:spring4/IntegrationProperties.groovy")
    xmlns intjms:"http://www.springframework.org/schema/integration/jms"
    xmlns integration:"http://www.springframework.org/schema/integration"

    amqConnectionFactory (ActiveMQConnectionFactory) {
        brokerURL = "<brokerUrl>"
    }

    jmsFactory (PooledConnectionFactory) {bean ->
        bean.destroyMethod = 'stop'
        connectionFactory = amqConnectionFactory
    }

    integration.channel(id:'plainRequestChannel')
    integration.channel(id:'plainReplyChannel')
    integration.channel(id:'errorChannel')

    intjms.'inbound-gateway'(
            id:'gateway',
            'request-destination-name': "QUEUE.IN",
            'default-reply-queueName': "QUEUE.OUT",
            'request-channel': 'plainRequestChannel',
            'error-channel': 'errorChannel',
            'reply-channel': 'plainReplyChannel',
            'connection-factory': 'jmsFactory'
    )
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2015-04-10
    相关资源
    最近更新 更多