2014-10-30 22 views
2

我已經通過JNDI設置中,JmsTemplate這樣的:無法將類型的值JmsManagedConnectionFactoryImpl]所需類型[javax.jms.ConnectionFactory] ​​

<bean id="jmsTopicCancelacionTemplate" class="org.springframework.jms.core.JmsTemplate"> 
     <property name="connectionFactory" ref="connectionFactory" /> 
     <property name="defaultDestination" ref="cancelacionTopic" /> 
     <property name="messageConverter" ref="oxmMessageConverter" /> 
     <property name="destinationResolver" ref="jmsDestResolver" /> 
     <property name="pubSubDomain" value="true" /> 
    </bean> 

<!-- look up the JMS ConnectionFactory in JNDI --> 
    <bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiName"> 
      <value>java:comp/env/jms/ConnectionFactory</value> 
     </property> 
    </bean> 

<bean id="requestQueue" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiName"> 
      <value>java:comp/env/jms/SchedulingRequestQueue</value> 
     </property> 
    </bean> 

我的web.xml:

<resource-ref> 
    <description>JMS Connection</description> 
    <res-ref-name>jms/ConnectionFactory</res-ref-name> 
    <res-type>javax.jms.ConnectionFactory</res-type> 
    <res-auth>Container</res-auth> 
    <res-sharing-scope>Shareable</res-sharing-scope> 
</resource-ref> 

但是,當我嘗試綁定我的Websphere中的JNDI資源時,啓動我的應用程序時出現以下錯誤:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.jms.core.JmsTemplate com.plexus.xesac_il.server.service.decide.DecideServiceImpl.jmsTemplate; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jmsTemplate' defined in class path resource [spring/xesac-il-appcontext-jms.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'com.ibm.ws.sib.api.jms.impl.JmsManagedConnectionFactoryImpl' to required type 'javax.jms.ConnectionFactory' for property 'connectionFactory'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [com.ibm.ws.sib.api.jms.impl.JmsManagedConnectionFactoryImpl] to required type [javax.jms.ConnectionFactory] for property 'connectionFactory': no matching editors or conversion strategy found 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:517) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:286) 
    ... 116 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jmsTemplate' defined in class path resource [spring/xesac-il-appcontext-jms.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'com.ibm.ws.sib.api.jms.impl.JmsManagedConnectionFactoryImpl' to required type 'javax.jms.ConnectionFactory' for property 'connectionFactory'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [com.ibm.ws.sib.api.jms.impl.JmsManagedConnectionFactoryImpl] to required type [javax.jms.ConnectionFactory] for property 'connectionFactory': no matching editors or conversion strategy found 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:912) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:855) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:770) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:489) 
    ... 118 more 
Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'com.ibm.ws.sib.api.jms.impl.JmsManagedConnectionFactoryImpl' to required type 'javax.jms.ConnectionFactory' for property 'connectionFactory'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [com.ibm.ws.sib.api.jms.impl.JmsManagedConnectionFactoryImpl] to required type [javax.jms.ConnectionFactory] for property 'connectionFactory': no matching editors or conversion strategy found 
    at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:463) 
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:494) 
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:488) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1463) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1422) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1158) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
    ... 127 more 
Caused by: java.lang.IllegalStateException: Cannot convert value of type [com.ibm.ws.sib.api.jms.impl.JmsManagedConnectionFactoryImpl] to required type [javax.jms.ConnectionFactory] for property 'connectionFactory': no matching editors or conversion strategy found 
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:267) 
    at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:448) 
    ... 133 more 

我的理解是,IBM的JmsManagedConnectionFactoryImpl應該實現JmsTemplate,否則我甚至沒有機會通過WebSphere進行綁定,那麼這裏可能會出現什麼問題?

回答

5

JmsTemplate是Spring框架中的一個類。所以類JmsManagedConnectionFactoryImpl與JmsTemplate無關(JmsTemplate使用ConnectionFactory,但不是顛倒的方式)。不過,我認爲你的問題是,你在應用程序中打包JMS api類。在WebSphere中部署應用程序時,WAS在類路徑中也有API類,並且存在衝突,因爲在不同的類加載器中有兩個API JAR。所以只需從您的部署中排除API jar,並且錯誤應該消失。

+0

我知道他們是不同的;我的意思是JmsTemplate期待一個javax.jms.ConnectionFactory,這正是我所提供的。當你談論api時,你的意思是我應該排除包含javax.jms.ConnectionFactory的jar以讓WAS使用他的?這不應該通過配置我的項目PARENT_LAST類加載(我已經有)嗎? – 2014-10-30 10:29:06

+0

不,因爲WebSphere使用他的類來初始化JMS連接(因爲您在WebSphere中配置了它),然後Spring嘗試使用WebSphere中的連接對象與特定於應用程序的類(這是相同的代碼),但使用不同的類對象來自不同的類加載器(你剛剛加入了類加載器地獄)。 – dunni 2014-10-30 10:33:23

+0

你是對的。謝謝。 – 2014-10-30 11:44:33

相關問題