本文介绍了骆驼+ MyBatis + Apache白羊座的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在遵循位于以下位置的设置指南:Camel MyBatis集成指南.我正在使用Service Mix 5.0.1.我使用了3.2.4.RELEASE中的features-install spring-mybatis.我的SqlMapConfig文件仅包含有关typeHandlers和typeAliases的信息.

I'm following the setup guide located at: Camel MyBatis Integration Guide. I am using Service Mix 5.0.1. I used features-install spring-mybatis which pulled in 3.2.4.RELEASE. My SqlMapConfig file only contains information about the typeHandlers and typeAliases.

当我开始混合服务然后启动我的应用程序时,我收到以下堆栈跟踪:

When I start service mix and then start my app I receive the following stack trace:

org.osgi.service.blueprint.container.ComponentDefinitionException: Errorsetting property: PropertyDescriptor <name: configLocation, getter: null, setter: [class org.mybatis.spring.SqlSessionFactoryBean.setConfigLocation(interface org.springframework.core.io.Resource)]
at org.apache.aries.blueprint.container.BeanRecipe.setProperty(BeanRecipe.java:941)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:907)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:888)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BeanRecipe.internalCreate2(BeanRecipe.java:820)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:787)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.di.AbstractRecipe$1.call(AbstractRecipe.java:79)[8:org.apache.aries.blueprint.core:1.4.0]
at java.util.concurrent.FutureTask.run(FutureTask.java:262)[:1.7.0_45]
at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:88)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.di.RefRecipe.internalCreate(RefRecipe.java:62)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:106)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BeanRecipe.setProperty(BeanRecipe.java:933)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:907)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:888)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BeanRecipe.internalCreate2(BeanRecipe.java:820)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:787)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.di.AbstractRecipe$1.call(AbstractRecipe.java:79)[8:org.apache.aries.blueprint.core:1.4.0]
at java.util.concurrent.FutureTask.run(FutureTask.java:262)[:1.7.0_45]
at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:88)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BlueprintRepository.createInstances(BlueprintRepository.java:245)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BlueprintRepository.createAll(BlueprintRepository.java:183)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BlueprintContainerImpl.instantiateEagerComponents(BlueprintContainerImpl.java:681)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:378)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:269)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BlueprintExtender.createContainer(BlueprintExtender.java:276)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BlueprintExtender.createContainer(BlueprintExtender.java:245)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BlueprintExtender.modifiedBundle(BlueprintExtender.java:235)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.customizerModified(BundleHookBundleTracker.java:500)[11:org.apache.aries.util:1.1.0]
at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.customizerModified(BundleHookBundleTracker.java:433)[11:org.apache.aries.util:1.1.0]
at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$AbstractTracked.track(BundleHookBundleTracker.java:725)[11:org.apache.aries.util:1.1.0]
at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.bundleChanged(BundleHookBundleTracker.java:463)[11:org.apache.aries.util:1.1.0]
at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$BundleEventHook.event(BundleHookBundleTracker.java:422)[11:org.apache.aries.util:1.1.0]
at org.apache.felix.framework.util.SecureAction.invokeBundleEventHook(SecureAction.java:1103)[org.apache.felix.framework-4.0.3.jar:]
at org.apache.felix.framework.util.EventDispatcher.createWhitelistFromHooks(EventDispatcher.java:695)[org.apache.felix.framework-4.0.3.jar:]
at org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:483)[org.apache.felix.framework-4.0.3.jar:]
at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4244)[org.apache.felix.framework-4.0.3.jar:]
at org.apache.felix.framework.Felix.startBundle(Felix.java:1923)[org.apache.felix.framework-4.0.3.jar:]
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:944)[org.apache.felix.framework-4.0.3.jar:]
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:931)[org.apache.felix.framework-4.0.3.jar:]
at org.apache.karaf.shell.osgi.StartBundle.doExecute(StartBundle.java:37)[39:org.apache.karaf.shell.osgi:2.3.4]
at org.apache.karaf.shell.osgi.BundlesCommand.doExecute(BundlesCommand.java:37)[39:org.apache.karaf.shell.osgi:2.3.4]
at org.apache.karaf.shell.console.OsgiCommandSupport.execute(OsgiCommandSupport.java:38)[15:org.apache.karaf.shell.console:2.3.4]
at org.apache.felix.gogo.commands.basic.AbstractCommand.execute(AbstractCommand.java:35)[15:org.apache.karaf.shell.console:2.3.4]
at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:78)[15:org.apache.karaf.shell.console:2.3.4]
at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:474)[15:org.apache.karaf.shell.console:2.3.4]
at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:400)[15:org.apache.karaf.shell.console:2.3.4]
at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)[15:org.apache.karaf.shell.console:2.3.4]
at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183)[15:org.apache.karaf.shell.console:2.3.4]
at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120)[15:org.apache.karaf.shell.console:2.3.4]
at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:89)[15:org.apache.karaf.shell.console:2.3.4]
at org.apache.karaf.shell.console.jline.Console.run(Console.java:183)[15:org.apache.karaf.shell.console:2.3.4]
at org.apache.karaf.shell.console.jline.DelayedStarted.run(DelayedStarted.java:79)[15:org.apache.karaf.shell.console:2.3.4]
*Caused by: java.lang.Exception: Unable to convert value /META-INF/SqlMapConfig.xml to type interface org.springframework.core.io.Resource. Type interface org.springframework.core.io.Resource is an interface or an abstract class*
at org.apache.aries.blueprint.container.AggregateConverter.createObject(AggregateConverter.java:310)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.AggregateConverter.convertFromString(AggregateConverter.java:304)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.AggregateConverter.convert(AggregateConverter.java:174)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BlueprintRepository.convert(BlueprintRepository.java:402)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.utils.ReflectionUtils$PropertyDescriptor.convert(ReflectionUtils.java:394)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.utils.ReflectionUtils$MethodPropertyDescriptor.internalSet(ReflectionUtils.java:628)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.utils.ReflectionUtils$PropertyDescriptor.set(ReflectionUtils.java:378)[8:org.apache.aries.blueprint.core:1.4.0]
at org.apache.aries.blueprint.container.BeanRecipe.setProperty(BeanRecipe.java:939)[8:org.apache.aries.blueprint.core:1.4.0]

...还有50个

我的Bean定义如下:

My Bean definitions are as follows:

<bean id="dataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
  <argument>
    <bean class="com.mchange.v2.c3p0.ComboPooledDataSource">
      <property name="driverClass" value="oracle.jdbc.OracleDriver"/>
      <property name="jdbcUrl" value="jdbc:oracle:thin:@intersting-ip:port:schema"/>
      <property name="user" value="user"/>
      <property name="password" value="password"/>
    </bean>
  </argument>
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource"/>
  <property name="configLocation" value="/META-INF/SqlMapConfig.xml"/>
  <property name="mapperLocations" value="classpath*:META-INF/mappers/**/*.xml"/>
</bean>

<bean id="mybatis" class="org.apache.camel.component.mybatis.MyBatisComponent">
  <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

更新配置和新错误

更新的配置:

<bean id="myBatis" class="org.apache.camel.component.mybatis.MyBatisComponent">
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

<bean id="mybatisConfig" class="org.springframework.core.io.ClassPathResource">
    <argument value="classpath*:META-INF/SqlMapConfig.xml" />
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
    <argument>
        <bean class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="oracle.jdbc.OracleDriver"/>
            <property name="jdbcUrl" value="jdbc:oracle:thin:@intersting-ip:port:schema"/>
            <property name="user" value="user"/>
            <property name="password" value="password"/>
        </bean>
    </argument>
</bean>

<!-- Without this, the creation of myBatis will bomb out stating that org.mybatis.spring.SqlSessionFactoryBean is not an instance of org.apache.ibatis.session.SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.apache.ibatis.session.SqlSessionFactory" factory-ref="sqlSessionFactoryBean" factory-method="getObject" />

<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="cctvDataSource"/>
    <property name="configLocation" ref="mybatisConfig"/>
    <property name="mapperLocations">
        <array value-type="org.springframework.core.io.Resource">
            <bean class="org.springframework.core.io.ClassPathResource">
                <argument value="classpath*:META-INF/mappers/**/*.xml" />
            </bean>
        </array>
    </property>
</bean>

更新的错误

2014-08-06 10:46:20,824 | ERROR | mix\5.0.1/deploy | BlueprintContainerImpl | ?? | 7 - org.apache.aries.blueprint.core - 1.4.0 | Unable to start blueprint container for bundle project org.osgi.service.blueprint.container.ComponentDefinitionException: Error when instantiating bean sqlSessionFactory of class interface org.apache.ibatis.session.SqlSessionFactory
....
Caused by: java.io.FileNotFoundException: class path resource [classpath*:META-INF/SqlCookConfig.xml] cannot be opened because it does not exist
  at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:157)
  at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:358)
 at org.mybatis.spring.SqlSessionFactoryBean.afterPropertiesSet(SqlSessio

nFactoryBean.java:340)

nFactoryBean.java:340)

推荐答案

您正在使用的指南不是Spring的白羊座蓝图,这是问题的主要根源. mybatis-spring 用于集成,并且使用spring专用的东西.

The guide you are using is for spring not Aries blueprint and this is the main source of the problem. mybatis-spring is used for integration and it uses spring specific things.

问题出在SqlSessionFactoryBeanconfigLocation属性上.应该是spring org.springframework.core.io.Resource.如果您使用前缀给出提示. Aries对spring一无所知,也没有从String到spring Resource的内置转换器.

The problem is with configLocation property of SqlSessionFactoryBean. It should be spring org.springframework.core.io.Resource. Spring can automatically convert string to Resource if you use prefix to give a hint. Aries knows nothing about spring and doesn't have built in converter from String to spring Resource.

有两种解决方法:

  1. 将实现bean的Resource注入到SqlSessionFactoryBean而不是字符串中
  2. 实现您自己的org.osgi.service.blueprint.container.Converter,该实现将使用字符串并返回Resource实现.转换器应作为常规bean添加到上下文中,并在需要时由Aries用于转换.在这种情况下,SqlSessionFactoryBean的定义不会更改.
  1. inject Resource implementing bean to SqlSessionFactoryBean instead of string
  2. implement your own org.osgi.service.blueprint.container.Converter which will take string and return Resource implementation. The converter should be added to context as regular bean and it will be used by Aries for conversion when needed. In this case definition of SqlSessionFactoryBean is not changed.

在两种情况下,您都可以使用org.springframework.core.io.ClassPathResource或自己实现Resource.

In both cases you may use org.springframework.core.io.ClassPathResource or implement Resource yourself.

这篇关于骆驼+ MyBatis + Apache白羊座的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-22 09:29