2013-12-13 102 views
1

任何人都可以指出我适合Mule 3.4 CE的mule-module-jpa的工作示例吗?在3.4.0 CE中使用带有Hibernate的mule-module-jpa 1.2.0。如何定义EntityManager?

我看上去很高,花了一天的好时间试图让测试运行,并试图在mule应用程序中设置正确定义的entityManagerFactory。

当我在这里看到描述模块功能的文章时,我很兴奋。 http://blogs.mulesoft.org/getting-started-with-jpa-and-mule/不幸的是,文章缺乏关于模块配置的任何细节。

我接下来找到了该模块的github回购(https://github.com/mulesoft/mule-module-jpa),并链接到https://github.com/mulesoft/mule-module-jpa处的“文档”。再次没有关于entityManager配置的细节。另外还注意到,那里的maven信息似乎已经过时了,Studio将为mule-module-jpa的1.2.0版本插入maven-mule-plugin,Studio将通过mule更新站点进行安装。

我接下来在https://github.com/mulesoft/mule-module-jpa/tree/master/src/test/resources的mule-module-jpa的源文件中查看测试,看看我是否可以拼凑一个解决方案。

使用我得到的工作室和/或maven使用该模块编译一个小骡子应用程序,但它不会开始给出一个由java.lang.ClassNotFoundException:org.hibernate.ejb.HibernatePersistence的根本原因由于:java.lang.NoClassDefFoundError:org/hibernate/ejb/HibernatePersistence

我的maven deps包括相关的Hibernate的东西,我确实看到在工作室下运行时,jar包含在输出目录中。但骡类加载器似乎无法找到它们......或者我对需要的东西一无所知。

我试图Hibernate和Spring-ORM版本的几种组合,目前正在使用最新的每个:

<dependencies> 
... 
     <dependency> 
     <groupId>org.mule.modules</groupId> 
     <artifactId>mule-module-jpa</artifactId> 
     <version>1.2.0</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>${hibernate.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>${hibernate.version}</version>  
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator-annotation-processor</artifactId> 
     <version>4.1.0.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.26</version> 
    </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-tx</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-orm</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-jdbc</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
</dependencies> 


<plugins> 
... 
<plugin> 
       <groupId>org.mule.tools</groupId> 
       <artifactId>maven-mule-plugin</artifactId> 
       <version>1.9</version> 
       <extensions>true</extensions> 
       <configuration> 
        <copyToAppsDirectory>true</copyToAppsDirectory> 
       <inclusions> 
         <inclusion> 
          <groupId>org.mule.modules</groupId> 
          <artifactId>mule-module-jpa</artifactId> 
         </inclusion> 
        </inclusions> 
       </configuration> 
      </plugin> 
</plugins> 

而且我简单:

<spring.version>4.0.0.RELEASE</spring.version> 
<hibernate.version>4.2.2.Final</hibernate.version> 

我的POM样子的有关部分骡子配置看起来像:

<?xml version="1.0" encoding="UTF-8"?> 
<mule version="CE-3.4.0" 
xmlns:http="http://www.mulesoft.org/schema/mule/http" 
xmlns:jpa="http://www.mulesoft.org/schema/mule/jpa" 
xmlns="http://www.mulesoft.org/schema/mule/core" 
xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" 
xmlns:spring="http://www.springframework.org/schema/beans" 
xmlns:util="http://www.springframework.org/schema/util" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd 
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd 
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd 
http://www.mulesoft.org/schema/mule/jpa http://www.mulesoft.org/schema/mule/jpa/1.0/mule-jpa.xsd 
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd 
"> 

     <spring:beans> 
     <spring:bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <spring:property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
     <spring:property name="url" value="jdbc:mysql://localhost:3306/test"/> 
     <spring:property name="username" value="XXXX"/> 
     <spring:property name="password" value="XXXX"/> 
    </spring:bean> 

    <spring:bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <spring:property name="dataSource" ref="datasource"/> 
     <spring:property name="jpaVendorAdapter"> 
      <spring:bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <spring:property name="showSql" value="true"/> 
       <spring:property name="generateDdl" value="false"/> 
       <spring:property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"/> 
      </spring:bean> 
     </spring:property> 
    </spring:bean> 
    </spring:beans> 

    <jpa:config name="Java_Persistence_API" entityManagerFactory-ref="entityManagerFactory" doc:name="Java Persistence API"/> 

    <flow name="jpa_test2Flow1" doc:name="jpa_test2Flow1"> 
     <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" path="query" doc:name="HTTP"/> 
     <logger level="INFO" doc:name="Logger"/> 
     <jpa:find config-ref="Java_Persistence_API" entityClass="domain.Dog" id-ref="#[message.payload.name]" doc:name="Java Persistence API"/> 
    </flow> 
</mule> 

我得到的完整例外是:

异常在线程 “主” org.mule.module.launcher.DeploymentInitException:ClassNotFoundException的:org.hibernate.ejb.HibernatePersistence 在org.mule.module.launcher.application.DefaultMuleApplication.init(DefaultMuleApplication.java:219 ) at org.mule.module.launcher.application.ApplicationWrapper.init(ApplicationWrapper.java:64) at org.mule.module.launcher.DefaultMuleDeployer.deploy(DefaultMuleDeployer.java:47) at org.mule.tooling .server.application.ApplicationDeployer.run(ApplicationDeployer.java:58) at org.mule.tooling.server.application.ApplicationDeployer.main(ApplicationDeployer.java:91) 导致:org.mule.api.config.ConfigurationException :用名称'e创建bean时出错在URL中定义的ntityManagerFactory [file:/home/matthew/MuleStudio/workspace/.mule/apps/jpa_test2/jpa_test2.xml]:无法创建内部bean'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b'的类型[org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter],同时设置bean属性'jpaVendorAdapter';嵌套的异常是org.springframework.beans.factory.BeanCreationException:在URL [file:/ home/matthew/MuleStudio/workspace /中定义的名称'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b'中创建bean时出错。mule/apps/jpa_test2/jpa_test2.xml]:bean的实例化失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化bean类[org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter]:构造函数抛出异常;嵌套异常是org.mule.config.builders.AbstractConfigurationBuilder中的java.lang.NoClassDefFoundError:org/hibernate/ejb/HibernatePersistence(org.mule.api.lifecycle.InitialisationException)(org.mule.api.config.ConfigurationException) 。配置(AbstractConfigurationBuilder.java:52) 在org.mule.config.builders.AbstractResourceConfigurationBuilder.configure(AbstractResourceConfigurationBuilder.java:78) 在org.mule.context.DefaultMuleContextFactory.createMuleContext(DefaultMuleContextFactory.java:84) 的组织。 mule.module.launcher.application.DefaultMuleApplication.init(DefaultMuleApplication.java:207) ... 4更多 引起:org.mule.api.config.ConfigurationException:在URL中定义的名称为'entityManagerFactory'的bean创建时出错[文件:/home/matthew/MuleStudio/workspace/.mule/apps/jpa_te st2/jpa_test2.xml]:设置bean属性'jpaVendorAdapter'时,不能创建[org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter]类型的内部bean'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b';嵌套异常是org.springframework.beans.factory.BeanCreationException:在URL [文件:/home/matthew/MuleStudio/workspace/.mule中定义的名称'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b'中创建bean时出错/apps/jpa_test2/jpa_test2.xml]:Bean实例化失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化bean类[org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter]:构造函数抛出异常; (org.mule.api.lifecycle.InitialisationException) at org.mule.config.builders.AbstractConfigurationBuilder.configure(AbstractConfigurationBuilder.java:52) at org(java.lang.NoClassDefFoundError):org/hibernate/ejb/HibernatePersistence(org.mule.api.lifecycle.InitialisationException) .mule.config.builders.AbstractResourceConfigurationBuilder.configure(AbstractResourceConfigurationBuilder.java:78) at org.mule.config.builders.AutoConfigurationBuilder.autoConfigure(AutoConfigurationBuilder.java:101) at org.mule.config.builders.AutoConfigurationBuilder.doConfigure (AutoConfigurationBuilder.java:57) at org.mule.config.builders.AbstractConfigurationBuilder.configure(AbstractConfigurationBuilder.java:46) ... 7更多 导致:org.mule.api.lifecycle.InitialisationException:创建bean时出错与南在URL [file:/home/matthew/MuleStudio/workspace/.mule/apps/jpa_test2/jpa_test2.xml]中定义的e'entityManagerFactory:无法创建内部bean'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b'类型为[org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter],同时设置bean属性'jpaVendorAdapter';嵌套异常是org.springframework.beans.factory.BeanCreationException:在URL [文件:/home/matthew/MuleStudio/workspace/.mule中定义的名称'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b'中创建bean时出错/apps/jpa_test2/jpa_test2.xml]:Bean实例化失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化bean类[org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter]:构造函数抛出异常;嵌套异常是java.lang.NoClassDefFoundError:组织/在org.mule.config.spring.SpringXmlConfigurationBuilder.createSpringRegistry在org.mule.registry.AbstractRegistry.initialise(AbstractRegistry.java:117) 冬眠/ EJB/HibernatePersistence (SpringXmlConfigurationBuilder。 java:119) at org.mule.config.spring.SpringXmlConfigurationBuilder.doConfigure(SpringXmlConfigurationBuilder.java:73) at org.mule.config.builders.AbstractConfigurationBuilder.configure(AbstractConfigurationBuilder.java:46) ... 11 more 原因:org.springframework.beans.factory.BeanCreationException:在URL [file:/home/matthew/MuleStudio/workspace/.mule/apps/jpa_test2/jpa_test2.xml]中定义的名称为'entityManagerFactory'的bean创建时出错:Can not创建内部bean'org.springframework.orm.jpa.vendor.HibernateJpaVendorAd设置bean属性'jpaVendorAdapter'时,类型[org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter]的#495b317b';嵌套异常是org。springframework.beans.factory.BeanCreationException:在URL [file:/home/matthew/MuleStudio/workspace/.mule/apps/jpa_test2/中定义的名称'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b'中创建bean时出错jpa_test2.xml]:bean的实例化失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化bean类[org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter]:构造函数抛出异常;嵌套异常是org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:282) org.springframework.beans.factory.support中的java.lang.NoClassDefFoundError:org/hibernate/ejb/HibernatePersistence 。 BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:121) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1391) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory。 java:1132) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:522) at org.springframework.be org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:295) at org.springframework.beans.factory.support .DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory .java:194) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1117) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:922) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) at org.mule.config.spring.SpringRegistry.doInitialise(SpringRegistry.java:89) at org.mule.registry.AbstractRegistry。初始化(AbstractRegistry.java:109) ... 14更多 引起者:org.springframework.beans.factory.BeanCreationException:创建名为'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b'的bean时出错URL [file:/home/matthew/MuleStudio/workspace/.mule/apps/jpa_test2/jpa_test2.xml]:bean的实例化失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化bean类[org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter]:构造函数抛出异常;嵌套的异常是org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1011) org.springframework.beans.factory.support中的java.lang.NoClassDefFoundError:org/hibernate/ejb/HibernatePersistence 。 AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:957) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:490) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory。 java:461) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:271) ... 28更多 原因:org.springframework.beans.BeanInstantiationException:无法实例化bean类[org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter]:构造函数抛出异常;嵌套的异常是java.lang.NoClassDefFoundError:org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:163) (org/hibernate/ejb/HibernatePersistence SimpleInstantiationStrategy。的java:87) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1004) ... 32更 引起:java.lang.NoClassDefFoundError:有机/休眠/ EJB/HibernatePersistence 在org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter。(HibernateJpaVendorAdapter.java:57) 在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) at org.springframew ork.beans.BeanUtils.instantiateClass(BeanUtils.java:148) ... 34更多 导致:java.lang.ClassNotFoundException:org.hibernate.ejb.HibernatePersistence at java.net.URLClassLoader $ 1.run(URLClassLoader。 Java的:366) 在java.net.URLClassLoader的$ 1.run(URLClassLoader.java:355) 在java.security.AccessController.doPrivileged(本机方法) 在java.net.URLClassLoader.findClass(URLClassLoader.java:354) 在org.mule.module.launcher.FineGrainedControlClassLoader.findClass(FineGrainedControlClassLoader.java:179) 在org.mule.module.launcher.FineGrainedControlClassLoader.loadClass(FineGrainedControlClassLoader.java:123) 在java.lang.ClassLoader.loadClass( ClassLoader.java:358) ... 4 0更多

我开始觉得这个模块还没有准备好使用,尽管它可以作为工作室内部的云连接器使用吗?

回答

1

只是一个念头,mule已经包含了一些hibernate jars,包括hibernate-core和hibernate-jpa。该错误可能是由于冲突造成的。尝试验证没有找到的类是否已经在其中一个罐子中。

心连心 加布里埃尔

+0

谢谢,是的,这显然与骡子提供的3.6.0冲突。我用丑陋的方式解决了这个问题,只是发现这个模块在其他方面被破坏了。 – mmeyer

+0

@mmeyer,你能帮我的(可能是相同的)问题http://stackoverflow.com/questions/35195374/noclassdeffounderror-javax-validation-validation-occurs-even-validation-api-1-1 – May12

1

我已经取得了一些进展与此,但不尚未有合适的解决方案在骡使用JPA。

Mulesoft的mule-module-jpa(https://github.com/mulesoft/mule-module-jpa/)似乎假定Mule的其他版本不是3.4.0 CE,因为模块测试显示依赖于Hibernate 3.6.3,但Mule 3.4.0已经包含Hibernate Core 3.6。 0。这两个冲突。

我发现可以使用Hibernate 4.2.8替换../MuleStudio/plugins/org.mule.tooling.server.3.4.0_3.4.0.201311292125/mule/opt中的Hibernate核心。只要它通过Maven构建运行,Studio就可以很好地使用此模块。

为了让Studio停止抱怨Hibernate 3.6.0上缺少的缩进,我还破解了MANIFEST.MF和MULESOFT.SF文件(位于/MuleStudio/plugins/org.mule.tooling.server.3.4.0_3.4.0 .201311292125/META-INF /)来引用Hibernate 4.2.8。其中的SHA-1校验和显然无关紧要,因为Studio和Mule CE从它那里运行,不会抱怨替换。

黑客攻击后,我很兴奋,当我通过注释实体获得一些在Mu​​le中运行的JPA查询时。

当我发现这个mule-module-jpa 1.2.0无法提交JPA事务处理任何风格的持久性或合并时,我将它抛出并且它是否被包装在一个组件中,我的兴致很快就崩溃了。

我发现其他一些用户也发现EclipseLink也是这个问题的提供者。 Configuring the Mule JPA module to use Eclipse Link and MySQL

尽管它作为一个可用的CloudConnector由Mulesoft提供,但它似乎还没有准备好使用。

我真的希望这个项目能得到Mule的关注。这似乎很接近准备。

有似乎是一个非官方的,但相同名称的模块从这里第三方:http://code.google.com/p/mule-transport-jpa/

我已经证实,我完全一样的EntityManager,PersistenceProvider类和数据源设置工作得很好,这种第三方模块。但是这个模块似乎只支持XA txns或者根本不支持。也就是说,它将它所有的JPA事务封装在自己的范围内,似乎无法加入由Mule的SingleResourceTransaction启动的任何txn。

如果你关心能否在Mule中使用JPA,请为这个问题投票和/或游说Mulesoft进行一些修复。

0

Mule在$ {MULE_HOME}/lib/opt中包含hibernate JAR。它不包括hibernate-entitymanager.jar。所以如果你没有在你的类路径中包含它,你会得到ClassNotFound异常。如果包含它,它会给出java.lang.IllegalAccessError,因为它与提供hibernate核心JAR的mule冲突。

因此,解决方案是删除$ {MULE_HOME}/lib/opt中的hibernate JAR并添加您自己的JAR版本。如果您犯了错误,请备份。

更新

你可以尝试像loader.override选项mule-deploy.properties = “的类或包逗号分隔的列表”。如果您提到一个类或包,mule应用程序类加载器将覆盖父类加载器。如果你提到一个前缀为minus的类,那么这个类/包将被阻塞。请参阅mule文档以获取更多详细信息http://www.mulesoft.org/documentation/display/current/Classloader+Control+in+Mule#ClassloaderControlinMule-Fine-GrainedClassloadingControl

相关问题