【问题标题】:Cannot convert value of type [com.ibm.ejs.jms.JMSQueueConnectionFactoryHandle] to required type [javax.jms.ConnectionFactory]无法将类型 [com.ibm.ejs.jms.JMSQueueConnectionFactoryHandle] 的值转换为所需类型 [javax.jms.ConnectionFactory]
【发布时间】:2016-07-03 14:42:09
【问题描述】:

我有标准的 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'

我从我的服务器上注意到我在以下 jar 中有以下类

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?

【问题讨论】:

    标签: spring jms websphere mq


    【解决方案1】:

    经过大量试验和错误,我发现答案是在 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>
    

    【讨论】:

    • 我所有的spring jar都捆绑在一个jar中,如何排除jms jar。 -runtime_spring.jar -spring_jms.jar(运行时spring内部)
    • 您需要更改用于构建 runtime_spring.jar 的 pom.xml
    【解决方案2】:

    我也经历了很多尝试和错误来找到答案。如上所述,不包括 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>
    

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

    【讨论】:

      猜你喜欢
      • 2017-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 2017-05-20
      • 2020-07-02
      • 2017-01-28
      • 2019-08-23
      相关资源
      最近更新 更多