简体   繁体   English

如何解决Hibernate 5中的AbstractMethodError?

[英]How to solve AbstractMethodError in Hibernate 5?

i'm trying to use the hibernate 5 in Java EE with tomcat 7, and i'm getting this error: 我正在尝试使用tomcat 7中的Java EE中的hibernate 5,我收到此错误:

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)

I'm using JPA 2.1, I've deleted any jars of old jpa versions. 我正在使用JPA 2.1,我删除了任何旧jpa版本的jar。

Here is my dependencies in pom.xml: 这是我在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>

When i execute the code that throws the exception for the second time, i get a NoDefClassFoundError. 当我执行第二次抛出异常的代码时,我得到一个NoDefClassFoundError。

The hibernate seems booting right in the log, but isn't creating the entity manager. hibernate似乎在日志中启动,但不是创建实体管理器。

How solve this? 怎么解决这个?

AbstractMethodError is thrown when you have incompatibility between the jar you used to compile and the one referred while server is running the code. 当您用于编译的jar与服务器运行代码时引用的jar之间不兼容时,抛出AbstractMethodError。

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

"Thrown when an application tries to call an abstract method. Normally, this error is caught by the compiler; this error can only occur at run time if the definition of some class has incompatibly changed since the currently executing method was last compiled. “当应用程序尝试调用抽象方法时抛出。通常,编译器会捕获此错误;如果自上次编译当前正在执行的方法以来某些类的定义发生了不兼容的更改,则此错误只能在运行时发生。

It could be due to the versions of hibernate-search & hibernate-entity-manager 这可能是由于hibernate-search和hibernate-entity-manager的版本

hibernate search seems to be using hibernate-commons-annotations 4.0.5 final hibernate搜索似乎正在使用hibernate-commons-annotations 4.0.5 final

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

Whereas

Hibernate entity manager seems to be using hibernate-commons-annotation-5.0.0.Final Hibernate实体管理器似乎正在使用hibernate-commons-annotation-5.0.0.Final

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

Check your Dependency Hierarchy tab for pom.xml in eclipse to find out which exact jar version is being used. 检查eclipse中pom.xml的Dependency Hierarchy选项卡,找出正在使用的jar版本。 Use to exclude incompatible versions. 用于排除不兼容的版本。 usually this is done automatically by pom. 通常这是由pom自动完成的。 You could also check your WEB-INF/lib folder to see what are jars are being downloaded. 您还可以检查WEB-INF / lib文件夹以查看正在下载的jar文件。

Also I see that you are using this jar. 我也看到你正在使用这个罐子。 If you are using tomcat 7 better to use this instead and have its scope "provided" because at runtime the web app refers to the tomcat servlet api 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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM