【问题标题】:Cannot find the JBoss ConnectionFactory with a JNDI lookup in Spring annotation configuration在 Spring 注释配置中无法通过 JNDI 查找找到 JBoss ConnectionFactory
【发布时间】:2013-01-08 17:14:00
【问题描述】:

尽管似乎成功绑定了 JBoss(AS 7.1.1.Final)连接工厂:

[org.jboss.as.messaging] (MSC service thread 1-9) JBAS011601: Bound messaging object to jndi name java:/ConnectionFactory

查找中的 ConnectionFactory 始终为空。谁能看出问题出在哪里?

@Configuration
@ComponentScan(basePackages = "reservation")
public class AppConfiguration extends WebMvcConfigurerAdapter {

    // ***********************//
    // ******** JMS **********//
    // ***********************//
    @Bean
    public ConnectionFactory jmsConnectionFactory() {
        JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
        jndiObjectFactoryBean.setJndiName("java:/ConnectionFactory");
        return (ConnectionFactory) jndiObjectFactoryBean.getObject();
    }

    @Bean
    public Queue requestsQueue() {
        JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
        jndiObjectFactoryBean.setJndiName("java:/queue/test");
        return (Queue) jndiObjectFactoryBean.getObject();
    }

    @Bean
    public JmsOperations jmsOperations() {
        final JmsTemplate jmsTemplate = new JmsTemplate(jmsConnectionFactory());
        jmsTemplate.setDefaultDestination(requestsQueue());
        return jmsTemplate;
    }
}

【问题讨论】:

    标签: spring jboss7.x spring-annotations spring-jms jmstemplate


    【解决方案1】:

    很遗憾,您必须手动拨打afterPropertiesSet()

    @Bean
    public ConnectionFactory jmsConnectionFactory() {
        JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
        jndiObjectFactoryBean.setJndiName("java:/ConnectionFactory");
        jndiObjectFactoryBean.afterPropertiesSet();                    //HERE
        return (ConnectionFactory) jndiObjectFactoryBean.getObject();
    }
    

    我特别喜欢的一个替代方案如下:

    @Bean
    public JndiObjectFactoryBean jmsConnectionFactoryFactoryBean() {
        JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
        jndiObjectFactoryBean.setJndiName("java:/ConnectionFactory");
        return jndiObjectFactoryBean;
    }
    
    public ConnectionFactory jmsConnectionFactory() {
        return (ConnectionFactory) jmsConnectionFactoryFactoryBean().getObject();
    }
    

    注意jmsConnectionFactory() 没有@Bean 注释(这很重要)。在这种情况下,Spring 会为您调用适当的回调方法。

    【讨论】:

    • @chrisjleu 建议的编辑被拒绝为无效编辑:“将public jmsConnectionFactory() 更改为public ConnectionFactory jmsConnectionFactory()。如果需要更改,请查看并进行更改。
    • @ACB:不确定“请查看”是什么意思,但没有编辑就无法编译,所以这就是我制作它的原因。现在我已经能够完全测试并且可以确认答案是正确的。顺便说一句,我采用了替代/第二种方法,并将其也用于配置 requestsQueue()
    • @chrisjleu:您的编辑是有效的,但在我来之前它被拒绝了。尽管如此,我还是应用了这些更改。很高兴它对您有所帮助!
    • @ACB:添加评论总是更好吗?我不同意。答案是一个非常好的答案,除了一个小错误。更正答案本身意味着该问题的未来观众不必浪费时间阅读在进行更正时不再相关的 cmets。这部分是编辑按钮的目的,不是 - 建议更正或改进吗?无论如何,如果你想让 Tomasz 先审查它,为什么不让他...
    • 来自元答案:“其他审阅者拒绝了您的编辑,因为您的更改过于激进;更改代码通常是不受欢迎的,除非您要更正答案代码中的明显拼写错误”。我倾向于认为我所做的更改接近于对错字的更正,但仍然注意到您的观点。也许我们应该结束这一切,因为尽管这些 cmets 对于这个特定问题完全没用,但我开始觉得删除它们会很可惜...... ;-)
    猜你喜欢
    • 2018-08-25
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2012-01-24
    • 1970-01-01
    • 2017-06-15
    相关资源
    最近更新 更多