JPA 存储过程 NoSuchMethodError
JPA Stored procedure NoSuchMethodError
我将此 JPA 2.1 StoredProcedureQuery 作为我正在处理的示例。
无论如何,我在数据库中有一个名为“XYZ” 的存储过程,我创建了一个 class:
@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 class:
@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
谢谢
您的项目编译看起来正确地引用了 JPA 2.1,但是 NoSuchMethodError
表示运行时可用的 EntityManager
来自早期的 JPA 版本。 EntityManager
可能由您的 EJB 容器提供。请查阅您正在使用的任何应用程序服务器的文档以确定如何升级到 JPA 2.1。
编辑:
您还应该在 pom.xml.
中将应用程序服务器提供的任何 Maven 依赖项标记为 <scope>provided</scope>
我将此 JPA 2.1 StoredProcedureQuery 作为我正在处理的示例。
无论如何,我在数据库中有一个名为“XYZ” 的存储过程,我创建了一个 class:
@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 class:
@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
谢谢
您的项目编译看起来正确地引用了 JPA 2.1,但是 NoSuchMethodError
表示运行时可用的 EntityManager
来自早期的 JPA 版本。 EntityManager
可能由您的 EJB 容器提供。请查阅您正在使用的任何应用程序服务器的文档以确定如何升级到 JPA 2.1。
编辑: 您还应该在 pom.xml.
中将应用程序服务器提供的任何 Maven 依赖项标记为<scope>provided</scope>