2015-09-09 136 views
4

我想要使用休眠5的Java EE在Tomcat 7,我收到此错误:如何解决Hibernate 5中的AbstractMethodError?

java.lang.AbstractMethodError 
org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:278) 
org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) 
org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:802) 
org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58) 
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55) 
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39) 
controller.dao.GenericDAO.<clinit>(GenericDAO.java:28) 
com.mycompany.mazkrest.UsuarioResource.login(UsuarioResource.java:89) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
java.lang.reflect.Method.invoke(Method.java:483) 
org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) 
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144) 
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161) 
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:205) 
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99) 
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) 
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) 
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) 
org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:309) 
org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 
org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 
org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
org.glassfish.jersey.internal.Errors.process(Errors.java:267) 
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) 
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:292) 
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1139) 
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:460) 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386) 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:334) 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

我使用JPA 2.1,我已经删除了旧版本的JPA任何广口瓶。

这是我的依赖关系的pom.xml:

<dependencies> 
    <dependency> 
     <groupId>org.glassfish.jersey.containers</groupId> 
     <artifactId>jersey-container-servlet-core</artifactId> 
     <!-- <version>${jersey.version}</version>--> 
     <!-- use the following artifactId if you don't need servlet 2.x compatibility --> 
     <!-- artifactId>jersey-container-servlet</artifactId --> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-war-plugin</artifactId> 
     <version>2.6</version> 
    </dependency> 

    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.36</version> 
    </dependency> 

    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>2.6.1</version> 
    </dependency> 

    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.6.1</version> 
    </dependency> 

    <dependency> 
     <groupId>com.fasterxml.jackson.jaxrs</groupId> 
     <artifactId>jackson-jaxrs-json-provider</artifactId> 
     <version>2.6.1</version> 
    </dependency> 

    <dependency> 
     <groupId>com.voodoodyne.jackson.jsog</groupId> 
     <artifactId>jackson-jsog</artifactId> 
     <version>1.1</version> 
     <scope>compile</scope> 
    </dependency> 

    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-annotations</artifactId> 
     <version>2.6.1</version> 
    </dependency> 

    <dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-json-jackson</artifactId> 
     <!-- <version>${jersey.version}</version>--> 
    </dependency> 

    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-search</artifactId> 
     <version>5.3.0.Final</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.lucene</groupId> 
     <artifactId>lucene-core</artifactId> 
     <version>5.3.0</version> 
    </dependency> 

    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>5.0.1.Final</version> 
    </dependency> 

    <dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-web-api</artifactId> 
     <version>7.0</version> 
     <type>jar</type> 
    </dependency> 
</dependencies> 

当我执行抛出异常,第二次的代码,我得到一个NoDefClassFoundError。

的休眠似乎在日志中启动的权利,但不创造实体管理器。

如何解决这个问题?当你有你用来编译罐子,而服务器运行的代码引用的一个之间的不兼容性

回答

3

AbstractMethodError被抛出。如果某些类的定义,因为发生了不相容改变只能出现在运行时该错误;当应用程序试图调用一个抽象方法

http://docs.oracle.com/javase/7/docs/api/java/lang/AbstractMethodError.html

”抛出该异常通常情况下,该错误是由编译器捕获。当前正在执行的方法,最后编译。

这可能是由于休眠的搜索&休眠实体管理器的版本

Hibernate Search的似乎是使用Hibernate公地的注解4.0.5最终

http://mvnrepository.com/artifact/org.hibernate/hibernate-search-engine/5.3.0.Final

Hibernate的实体管理器好像是用hibernate-commons-annotation-5.0.0.Final

http://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager/5.0.1.Final

检查你的依赖层次选项卡中的pom.xml eclipse找出正在使用哪个精确的jar版本。用于排除不兼容的版本。通常这是由pom自动完成的。您也可以检查您的WEB-INF/lib文件夹以查看正在下载的jar包。

我也看到你使用这个罐子。如果您更好地使用tomcat 7来代替它,并且将其作用域“提供”,因为在运行时,Web应用程序引用tomcat servlet api jar。

<dependency> 
    <groupId>org.apache.tomcat</groupId> 
    <artifactId>tomcat-servlet-api</artifactId> 
    <version>7.0.21</version> 
    <scope>provided</scope> 
    </dependency> 
+0

如果我使用alpha版本,可能会解决这个问题吗? http://mvnrepository.com/artifact/org.hibernate/hibernate-search-engine/5.5.0.Alpha1我对“测试”版本有点恐惧,这可能是一个解决方案吗?而且我使用的是Lucene 5.3.0,hibernate-search使用lucene 5.2.1,是否会导致另一个冲突? –

+1

问题解决了,我改变了hibernate-search和lucene-core的版本,并且工作。谢谢 –

相关问题