【发布时间】:2016-12-31 19:42:42
【问题描述】:
我在 Tomcat 8 (8.5.4) 上配置 ActiveMQ (5.14.0) 以公开 JMS 队列时遇到 famous BeanNotOfRequiredTypeException 异常Spring (3.2.8) 应用程序。
several 类似问题建议的修复(更改 AOP 和代理行为)没有帮助:应用更改后,再次出现相同的错误:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'notificationService': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'someQueue' must be of type [javax.jms.Queue], but was actually of type [org.apache.activemq.command.ActiveMQQueue]
即使ActiveMQQueue 实际上是Queue 类型。
当前配置:
Spring 应用程序通过 JNDI 查找队列:
<jee:jndi-lookup jndi-name="jms/someQueue" id="someQueue" />
队列在web.xml文件中被引用:
<resource-ref>
<description>Factory</description>
<res-ref-name>jms/someConnectionFactory</res-ref-name>
<res-type>javax.jms.QueueConnectionFactory</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
<description>Queue</description>
<res-ref-name>jms/someProcessQueue</res-ref-name>
<res-type>javax.jms.Queue</res-type>
<res-auth>Container</res-auth>
</resource-ref>
在服务器端,队列在 Tomcat server.xml 文件中配置为 GlobalNamingResources 为:
<Resource name="jms/someConnectionFactory"
auth="Container"
type="org.apache.activemq.ActiveMQConnectionFactory"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
description="JMS Connection Factory"
brokerURL="vm://localhost"
brokerName="LocalActiveMQBroker"
useEmbeddedBroker="true"
/>
<Resource name="jms/someQueue"
auth="Container"
type="org.apache.activemq.command.ActiveMQQueue"
description="JMS queue"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
physicalName="SOME.QUEUE"
/>
这是迄今为止应用的最小配置。相同的方法已应用于数据源和邮件服务 (server.xml + web.xml + JNDI) 工作正常,但在队列配置上失败。
问题:为什么 Spring 一直将其视为错误类型?在 Tomcat 8 上设置 ActiveMQ 并通过 JNDI 公开队列是否需要任何进一步的配置?
【问题讨论】:
-
您的 JNDI 正在寻找 jms/someQueue 但其他示例看起来像是将其命名为 jms/someProcessQueue
-
@Gandalf 输入问题时出现错误,感谢您的吐槽
标签: java spring tomcat activemq tomcat8