无法将[com.ibm.ejs.jms.JMSQueueConnectionFactoryHandle]类型的值转换为所需类型[javax.jms.ConnectionFactory]

时间:2016-03-17 10:09:03

标签: spring jms websphere mq

我有标准的Spring JMS配置

    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="defaultDestination" ref="jmsdestination" />
    </bean>
    <bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="jms/MQAuditQueueConnectionFactory" />
    </bean>
    <bean id="jmsDestinationResolver" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="jms/MQAuditQueue" />
    </bean>

我认为WAS 8.5.5.2上的标准MQ,当我启动我的网络应用程序时,我得到了:

 Cannot convert value of type [com.ibm.ejs.jms.JMSQueueConnectionFactoryHandle] to required type [javax.jms.ConnectionFactory] for property 'connectionFactory'

我在服务器上注意到以下jars中有以下类

class  com/ibm/ejs/jms/JMSQueueConnectionFactoryHandle.class found in /opt/websphere/was8//plugins/com.ibm.ws.runtime.jar

com/ibm/mq/jms/MQQueueConnectionFactory.class found in /opt/websphere/was8//installedConnectors/wmq.jmsra.rar/com.ibm.mqjms.jar

如何让WAS MQ使用第二个jar?

2 个答案:

答案 0 :(得分:1)

我也经历了大量的反复试验以找到答案。如上所述,不包括jms库的工作原理。但是,如何排除jms库并仍然能够编译代码?这似乎没有人提到过。解决方案是使jms库的范围“提供”(如果您使用的是Maven或Gradle)。

如上所述:

“提供意味着您需要JAR进行编译,但在运行时已经有环境提供的JAR,因此您不需要将其与您的应用程序一起打包。对于Web应用程序,这意味着JAR文件不会被放入WEB-INF / lib目录。“

所以在你的pom.xml中添加/更新这些:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jms</artifactId>
    <version>4.3.4.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>javax.jms</groupId>
            <artifactId>javax.jms-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>javax.jms</groupId>
    <artifactId>jms</artifactId>
    <version>1.1</version>
    <scope>provided</scope>
</dependency>

希望这对那些因互联网缺乏答案而感到沮丧的人有所帮助。

答案 1 :(得分:0)

经过大量的反复试验后,我发现答案是在你的pom.xml中排除spring-jms附带的jms-api。

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jms</artifactId>
  <version>${spring.version}</version>
    <exclusions>
      <exclusion>
        <groupId>javax.jms</groupId>
        <artifactId>javax.jms-api</artifactId>
      </exclusion>
    </exclusions>
</dependency>