【问题标题】:Error initializing caching connectionfactory in tomcat 7.0在 tomcat 7.0 中初始化缓存连接工厂时出错
【发布时间】:2015-11-16 16:30:50
【问题描述】:

我发现了一些类似的任务,但似乎没有一个能解决我的问题。我有一个 spring-application 并将这个应用程序部署到一个 maven-jetty-plugin 中。一切正常......码头出现没有错误,集成测试是绿色的。接下来我想让我的应用程序在 tomcat 7.0 中运行,但我遇到了一个异常,我无法修复它。可能有人有想法。提前非常感谢。

请注意,这是我部署到 tomcat 中的第一个应用程序,所以可能是我犯了一些非常基本的错误...

这里例外:

2015-11-15 20:30:14,371 | ERROR | localhost-startStop-1 | o.s.w.c.ContextLoader | Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cachingConnectionFactory' defined in class path resource [spring-jms.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'org.apache.activemq.ActiveMQConnectionFactory' to required type 'javax.jms.ConnectionFactory' for property 'targetConnectionFactory'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [org.apache.activemq.ActiveMQConnectionFactory] to required type [javax.jms.ConnectionFactory] for property 'targetConnectionFactory': no matching editors or conversion strategy found
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) ~[spring-context-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) ~[spring-context-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) ~[spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) ~[spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) [spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5003) [catalina.jar:7.0.64]
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5517) [catalina.jar:7.0.64]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:7.0.64]
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) [catalina.jar:7.0.64]
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) [catalina.jar:7.0.64]
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652) [catalina.jar:7.0.64]
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1095) [catalina.jar:7.0.64]
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1930) [catalina.jar:7.0.64]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_25]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_25]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_25]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_25]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_25]
Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'org.apache.activemq.ActiveMQConnectionFactory' to required type 'javax.jms.ConnectionFactory' for property 'targetConnectionFactory'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [org.apache.activemq.ActiveMQConnectionFactory] to required type [javax.jms.ConnectionFactory] for property 'targetConnectionFactory': no matching editors or conversion strategy found
    at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:476) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:512) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:506) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1523) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1482) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1222) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    ... 24 common frames omitted
Caused by: java.lang.IllegalStateException: Cannot convert value of type [org.apache.activemq.ActiveMQConnectionFactory] to required type [javax.jms.ConnectionFactory] for property 'targetConnectionFactory': no matching editors or conversion strategy found
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:287) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:461) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    ... 30 common frames omitted

这里是spring-jms.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jms="http://www.springframework.org/schema/jms"
    xmlns:amq="http://activemq.apache.org/schema/core"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/jms 
        http://www.springframework.org/schema/jms/spring-jms.xsd
        http://activemq.apache.org/schema/core 
        http://activemq.apache.org/schema/core/activemq-core.xsd"
    default-autowire="byName">

    <!-- START JMS Config -->

    <jms:annotation-driven/>

    <!-- Possible productive configuration -->


    <amq:broker id="broker" useJmx="false" persistent="false" >
        <amq:transportConnectors>
            <amq:transportConnector uri="tcp://localhost:61616"/>
        </amq:transportConnectors>
    </amq:broker>

    <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> 
        <!-- all config for embedded url see http://activemq.apache.org/broker-uri.html -->
        <!-- <property name="brokerURL" value="vm://embedded?broker.persistent=false"/>-->
<!--        <property name="brokerURL" value="vm://localhost?broker.persistent=false"/> -->
        <property name="brokerURL" value="tcp://localhost:61616"/>
    </bean> 



    <bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <property name="targetConnectionFactory" ref="connectionFactory"/>
    </bean> 

    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="cachingConnectionFactory"/>
        <property name="sessionTransacted" value="true" />
    </bean>

    <bean id = "destinationResolver" class = "org.springframework.jms.support.destination.DynamicDestinationResolver"></bean>

    <bean id="jmsListenerContainerFactory" class="org.springframework.jms.config.DefaultJmsListenerContainerFactory">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="errorHandler" ref="jmsErrorHandler"/>
        <property name="destinationResolver" ref="destinationResolver"/>
        <property name="concurrency" value="1-10"/>
    </bean>

    <bean id = "jmsErrorHandler" class = "com.mleitner.businessmaximizer.service.JMSErrorHandler" />

    <!-- END JMS Config -->

</beans>

版本:

  • activemq-all-5.12.0.jar
  • spring-core-4.1.6.RELEASE.jar
  • spring-context-4.1.6.RELEASE.jar spring-jms-4.1.6.RELEASE.jar
  • spring-beans-4.1.6.RELEASE.jar
  • Tomcat 7.0

更新:pom.xml jetty-maven-plugin 添加:

<plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.3.0.RC1</version>
                <dependencies>
                    <dependency>
                        <groupId>ch.qos.logback</groupId>
                        <artifactId>logback-classic</artifactId>
                        <version>1.1.2</version>
                    </dependency>
                    <dependency>
                        <groupId>ch.qos.logback</groupId>
                        <artifactId>logback-access</artifactId>
                        <version>1.1.2</version>
                    </dependency>
                    <dependency>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-api</artifactId>
                        <version>1.7.7</version>
                    </dependency>
                    <dependency>
                        <groupId>com.h2database</groupId>
                        <artifactId>h2</artifactId>
                        <version>1.4.179</version>
                    </dependency>
                    <dependency>
                        <groupId>c3p0</groupId>
                        <artifactId>c3p0</artifactId>
                        <version>0.9.1.2</version>
                    </dependency> 
                    <dependency>
                        <groupId>org.apache.activemq</groupId>
                        <artifactId>activemq-core</artifactId>
                        <version>5.7.0</version>
                        <exclusions>
                            <exclusion>
                                <artifactId>spring-context</artifactId>
                                <groupId>org.springframework</groupId>
                            </exclusion>
                            <exclusion>
                                <artifactId>spring-aop</artifactId>
                                <groupId>org.springframework</groupId>
                            </exclusion>
                        </exclusions>
                    </dependency>       
                </dependencies>
                <configuration>
                    <stopPort>9966</stopPort>
                    <stopKey>foo</stopKey>
                    <stopWait>10</stopWait>
                    <jettyXml>${basedir}/jetty-config/jetty-env.xml</jettyXml>
                    <systemProperties>
                        <systemProperty>
                            <name>org.eclipse.jetty.util.log.Log</name>
                            <value>org.eclipse.jetty.util.log.Slf4jLog</value>
                        </systemProperty>
                        <systemProperty>
                            <name>logback.configurationFile</name>
                            <value>${basedir}/jetty-config/logback.xml</value>
                        </systemProperty>
                    </systemProperties>
                    <webApp>
                        <extraClasspath>${basedir}/jetty-config/</extraClasspath>
                    </webApp> 
                </configuration>
            </plugin>

更新 2:我调整了 jms-config(现在我不使用任何 CachingConnectionFactory):

新的 jms 配置:

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> 
        <property name="brokerURL" value="tcp://localhost:61616"/>
    </bean> 
    <!--  
    <bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <property name="targetConnectionFactory" ref="connectionFactory"/>
    </bean> -->

    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="sessionTransacted" value="true" />
    </bean>

几乎相同的例外...

Caused by: java.lang.IllegalStateException: Cannot convert value of type [org.apache.activemq.ActiveMQConnectionFactory] to required type [javax.jms.ConnectionFactory] for property 'connectionFactory': no matching editors or conversion strategy found
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:287) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:461) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    ... 30 common frames omitted

【问题讨论】:

    标签: spring tomcat jms activemq


    【解决方案1】:

    这是一个类加载器问题。我在类路径中有两个不同的 jaxax.jms.ConnectionFactory 版本。

    • javax.jms-api-2.0.1.jar
    • activemq-all-5.7.0.jar

    删除 javax.jms-api 解决了这个问题。

    【讨论】:

    • 把我从地狱里救了出来 :) 谢谢哥们
    【解决方案2】:

    在 activeMQ 文档中,这是使用 Spring JMS 的方式

    <!-- a pooling based JMS provider -->
    
    
    
     <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>tcp://localhost:61616</value>
        </property>
      </bean>
    </property>
    
    
     </bean>
    
      <!-- Spring JMS Template -->
      <bean id="myJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory">
          <ref local="jmsFactory"/>
        </property>
      </bean>`
    

    【讨论】:

    • 我从 spring 中检查了 CachingConnectionFactory:targetConnectionFactory 是 javax.jms.ConnectionFactory 和 ActiveMQConnectionFactory 实现 javax.jms.ConnectionFactory => 见 activemq.apache.org/maven/5.12.0/apidocs/org/apache/activemq/… 所以一切似乎都很好......以及它为什么工作使用jetty-maven-plugin?!还是我理解错了?
    • 可能存在某种 jar 版本冲突?!这可能吗?
    • 我还是不明白你的意思是哪个java类=>我没有涉及java类...这都是标准的spring和activemq类。我无法将 spring CachingConnectionFactory 中的属性从 javax.jms.ConnectionFactory 更改为 ActiveMQConnectionFactory => 为此,我必须构建自己的 spring 版本...
    • 排除是一个很好的提示......只是一会儿,我为 jetty-maven-plugin 添加了我的 pom.xml => 我做了一个排除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 2022-07-13
    相关资源
    最近更新 更多