JPA 存储过程 NoSuchMethodError

Posted

技术标签:

【中文标题】JPA 存储过程 NoSuchMethodError【英文标题】:JPA Stored procedure NoSuchMethodError 【发布时间】:2015-08-06 16:06:32 【问题描述】:

我以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")
    
   ...

宁静:

@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

谢谢

【问题讨论】:

java.lang.NoSuchMethodError cannot be case to java.lang.exception ... 案例 ?那是错误的复制粘贴吗?无论如何,我敢打赌我所有的芯片你都在使用某些库的不兼容版本。检查您没有错误地导入 JPA 对不起,我拼错了。已修复,我确定我正在使用来自项目 Facets 的 JPA 2.1 【参考方案1】:

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

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

【讨论】:

我知道已经有一段时间了,但我刚刚和我公司的一个人谈过这个问题,他说 eclipselink 已经包含 JPA 2.1,所以应该很好。

以上是关于JPA 存储过程 NoSuchMethodError的主要内容,如果未能解决你的问题,请参考以下文章

使用JPA调用存储过程,返回存储多行数据的OUT参数(游标)

使用 Spring JPA 调用存储过程

JPA用参数调用存储过程

Spring Data JPA调用存储过程实例

Hibernate JPA 存储过程调用?

spring-data-jpa 1.11.16 带游标的存储过程