JPA存储过程NoSuchMethodError

时间:2015-08-06 16:06:33

标签: maven jpa-2.1

我正在关注这个JPA 2.1 StoredProcedureQuery作为我正在做的事情的一个例子。

无论如何,我在名为“ XYZ”的数据库中有一个存储过程,我创建了一个类:

@NameStoredProcedureQuery(
        name = "createXYZ",
        procedureName = "ZYX",
        resultClasses = XYZObj.class,
        parameters={
             @StoredProcedureParameter(mode=ParameterMode.IN, name = "name", type = String.class),
             @StoredProcedureParameter(mode=ParameterMode.OUT, name = "id", type = String.class)})
public class XYZObj {
    private String id;
    private String name;
    ...
}

这是我的DAO课程:

@Stateless
public class XYZDAO{
    @PersistenceContext(unitName = "PU")
    private EntityManager em;
    public String createXYZ(String name){
         StoredProcedureQuery query = em.createNamedStoredProcedureQuery("createXYZ");
         query.setParameter("name", name);
         query.execute();
         return query.getOutputParameterValue("id")
    }
   ...
}

RESTFUL:

@Stateless
@Path("/XYZ")
public class XYZServlet{
   @EJB
   private XYZDAO xyzDao;
   @GET
   @Path("test")
   public Response test(){
         xyzDao.createXYZ("myname");
         return Response.satus(Status.NO_CONTENT).build();
   }
}

的pom.xml

...
<dependencies>
<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>javax.persistence</artifactId>
    <version>2.1.0</version>
</dependency>
<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>org.eclipse.persistence.jpa</artifactId>
    <version>2.6.0-M3</version>
</dependency>

    ...

我在这一行得到NoSuchMethodError。

 StoredProcedureQuery query = em.createNamedStoredProcedureQuery("createXYZ");

有谁知道为什么?我使用的是正确版本的JPA吗?我错过了什么?

这是我得到的实际错误。

java.lang.ClassCastException: java.lang.NoSuchMethodError cannot be cast to java.lang.exception
     at javax.ejb.EJBException.getCauseByException(EJBException.java:23)
     at com.sun.jersey.server.impl.ejb.EJBExceptionMapper.toResponse(EJBExceptionMapper.java:63)
     at com.sun.jersey.server.impl.ejb.EJBExceptionMapper.toResponse(EJBExceptionMapper.java:54)
     at com.sun.jersey.server.impl.ejb.EJBExceptionMapper.toResponse(EJBExceptionMapper.java:67)
     at com.sun.jersey.server.impl.ejb.EJBExceptionMapper.toResponse(EJBExceptionMapper.java:54)
    truncated. see log file for complete stacktrace

由于

1 个答案:

答案 0 :(得分:1)

您的项目编译看起来正确引用了JPA 2.1,但是NoSuchMethodError表示运行时可用的EntityManager来自早期的JPA版本。 EntityManager可能由您的EJB容器提供。请查阅您正在使用的任何应用程序服务器的文档,以确定如何升级到JPA 2.1。

编辑: 您还应该在pom.xml中将应用程序服务器提供的任何maven依赖项标记为<scope>provided</scope>