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 依赖项标记为 <scope>provided</scope>
。
【讨论】:
我知道已经有一段时间了,但我刚刚和我公司的一个人谈过这个问题,他说 eclipselink 已经包含 JPA 2.1,所以应该很好。以上是关于JPA 存储过程 NoSuchMethodError的主要内容,如果未能解决你的问题,请参考以下文章