Java 在Spring Hibernate Maven Web App中外包POJO+DAOs+服务会导致Hibernate中的ArrayIndexOutOfBounds

Java 在Spring Hibernate Maven Web App中外包POJO+DAOs+服务会导致Hibernate中的ArrayIndexOutOfBounds,java,spring,hibernate,maven,Java,Spring,Hibernate,Maven,编辑:这是的副本 我有两个web项目,它们应该共享一个公共数据库,因此也有相应的POJO、DAO和服务。我的计划是将这些公共类外包到第三个maven项目中,将其安装到本地maven存储库中,并在其他两个对象的POM.xml文件中指定为依赖项。为了演示这个问题,我将只关注其中一个项目,其中包括一个RESTAPI 将所有文件合并到一个项目将产生以下设置: User | |- src/main/java | | | |- de.user.controller | | | | |

编辑:这是的副本

我有两个web项目,它们应该共享一个公共数据库,因此也有相应的POJO、DAO和服务。我的计划是将这些公共类外包到第三个maven项目中,将其安装到本地maven存储库中,并在其他两个对象的POM.xml文件中指定为依赖项。为了演示这个问题,我将只关注其中一个项目,其中包括一个RESTAPI

将所有文件合并到一个项目将产生以下设置:

User
|
|- src/main/java
|   |
|   |- de.user.controller
|   |   |
|   |   |- MyController.java
|   |
|   |- de.user.dao
|   |   |
|   |   |- UserDao.java
|   |
|   |- de.user.entity
|   |   |
|   |   |- User.java
|   |
|   |- de.user.dao
|       |
|       |- UserService.java
|
|- src/main/resources/META-INF
|   |
|   |- persistence.xml
|
|- src/main/webapp/WEB-INF
    |
    |- applicationContext.xml
    |
    |- rest-servlet.xml
    |
    |- web.xml
在这个阶段,一切正常,可以部署项目,当我调用URI从底层数据库检索所有用户时,正确的JSON字符串将打印在我的webbrowser中

现在,我设置了第二个maven项目,并将其作为依赖项包含在用户项目中:

User/pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>de.user</groupId>
    <artifactId>user</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>User</name>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>de.user</groupId>
            <artifactId>usercommon</artifactId>
            <version>0.1</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>${hibernate.version}</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>${hibernate.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

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

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

    <properties>
        <spring.version>4.0.2.RELEASE</spring.version>
        <hibernate.version>4.3.1.Final</hibernate.version>
    </properties>
</project>
试试这个

public List<User> findAll() {
        return  em.createQuery("select u from User u ").getResultList();
    }

这应该管用

我也有类似的问题。在我的例子中,ArrayIndexOutOfBoundsException是由org.hibernate.jpa.spi.AbstractEntityManagerImplresultClassChecking引发的,因为我忘了向persistence.xml添加实体

我希望您指的是hibernate版本,即:4.3.1.finalth dao类已经包含在public List findAll的post.mable replicate中{返回this.em.createQueryselect u from User u.getResultList;}导致-org.springframework.dao.InvalidDataAccessApiUsageException:-org.hibernate.hql.internal.ast.QuerySyntaxException:用户未映射[从用户u中选择u];嵌套异常为-java.lang.IllegalArgumentException:-org.hibernate.hql.internal.ast.QuerySyntaxException:用户未映射[从用户u中选择u]]使用root-cause-org.hibernate.hql.internal.ast.querysyntaxeption:User not mapped您可以共享您的用户实体吗?我编辑了最初的问题并将实体添加到文章的底部。该类是由Eclipse的JPA entity from tables向导创建的。嘿,我添加了注释,列名与字段名@Colum相同nname=firstname私有字符串firstname;不幸的是错误仍然存在……您能更新最新的实体吗?我想ter应该只是映射的问题
SEVERE: Servlet.service() for servlet [rest] in context with path [/User] threw exception [Request processing failed; nested exception is java.lang.ArrayIndexOutOfBoundsException: 0] with root cause
java.lang.ArrayIndexOutOfBoundsException: 0
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.resultClassChecking(AbstractEntityManagerImpl.java:362)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:344)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:334)
    at com.sun.proxy.$Proxy15.createQuery(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:257)
    at com.sun.proxy.$Proxy15.createQuery(Unknown Source)
    at de.user.dao.UserDao.findAll(UserDao.java:19)
    at de.user.dao.UserDao$$FastClassBySpringCGLIB$$94619575.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:711)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)
    at de.user.dao.UserDao$$EnhancerBySpringCGLIB$$b18c3ff9.findAll(<generated>)
    at de.user.service.UserService.findAll(UserService.java:16)
    at de.user.controller.MyController.findAll(MyController.java:22)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:409)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1044)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
package de.user.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;

import de.user.entity.User;

@Repository
public class UserDao {

    @PersistenceContext
    protected EntityManager em;

    public List<User> findAll() {
        return this.em.createQuery("from " + User.class.getName(), User.class).getResultList();
    }
}
package de.user.entity;

import java.io.Serializable;
import javax.persistence.*;


/**
 * The persistent class for the User database table.
 * 
 */
@Entity
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")
public class User implements Serializable {
    private static final long serialVersionUID = 6986289036842149115L;

    @Id
    @Column(name="id")
    @GeneratedValue
    private int id;

    @Column(name="firstname")
    private String firstname;

    @Column(name="lastname")
    private String lastname;

    public User() {
    }

    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirstname() {
        return this.firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return this.lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

}
public List<User> findAll() {
        return  em.createQuery("select u from User u ").getResultList();
    }
 @Id
 @column(name="your table id column name")
 @generatedValue
private int id;

@column(name="your table Firstname column name")
private String firstname;

@column(name="your table lastname column name")
private String lastname;