Jpa 容器管理的EntityManager中的NameNotFoundException
我试图使用容器管理的EntityManager,但是我得到了NameNotFoundException。我曾尝试在web.xml中添加条目,但没有成功Jpa 容器管理的EntityManager中的NameNotFoundException,jpa,ejb,jpa-2.0,ejb-3.0,jndi,Jpa,Ejb,Jpa 2.0,Ejb 3.0,Jndi,我试图使用容器管理的EntityManager,但是我得到了NameNotFoundException。我曾尝试在web.xml中添加条目,但没有成功 @Stateless @Path("/mypath") public class EmployeeService { @EJB private EmployeeDAO employeeDAO; @GET @Path("/myresults") @Produces(MediaType.APPLICATIO
@Stateless
@Path("/mypath")
public class EmployeeService {
@EJB
private EmployeeDAO employeeDAO;
@GET
@Path("/myresults")
@Produces(MediaType.APPLICATION_JSON)
public Employee getValues() {
Employee emp = new Employee();
try {
emp = employeeDAO.getEmployees(); // exception here
} catch (Exception ex) {
ex.printStackTrace();
}
return emp;
}
EmployeeDAO代码段
public class EmployeeDAO {
@PersistenceContext(unitName = "test-ejb", name = "persistence/em")
public Employee getEmployees() throws NamingException {
int empNo = 342;
Context context = new InitialContext();
context.lookup("java:comp/env");
EntityManager em = (EntityManager)context.lookup("persistence/em");
return em.find(Employee.class, empNo);
}
persistence.xml
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="test-ejb" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/testDS</jta-data-source>
<class>test.entity.Employees</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="eclipselink.target-server" value="OC4J"/>
<property name="javax.persistence.target-database" value="Oracle"/>
<property name="javax.persistence.logging.parameters" value="TRUE"/>
</properties>
</persistence-unit>
</persistence>
例外情况
ejb.EJBException:Setter注入被应用到非Setter方法:getValues;嵌套的异常是:java.lang.InstantiationException:Setter注入应用于非Setter方法:getValues
满栈
原因:java.lang.InstanceException:Setter注入应用于非Setter方法:getValues
位于com.evermind.server.deployment.J2EEContextAnnotationParser.ValidateInjectSetter(J2EEContextAnnotationParser.java:713)
位于com.evermind.server.deployment.J2EEContextAnnotationParser.createInjectionTarget(J2EEContextAnnotationParser.java:729)
位于com.evermind.server.deployment.J2EEContextAnnotationParser.parseInjectedMethod(J2EEContextAnnotationParser.java:378)
在com.evermind.server.ejb.deployment.BeanDescriptorAnnotationParser.ParseInjectedMethod和回调中(BeanDescriptorAnnotationParser.java:276)
位于com.evermind.server.ejb.deployment.SessionBeanDescriptorAnnotationParser.ParseInjectedMethod和回调(SessionBeanDescriptorAnnotationParser.java:95)
位于com.evermind.server.ejb.deployment.beandDescriptorAnnotationParser.parseAnnotations(beandDescriptorAnnotationParser.java:77)
在com.evermind.server.ejb.deployment.BeanDescriptorAnnotationParser.parseAnnotations(BeanDescriptorAnnotationParser.java:48)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于com.evermind.server.ejb.BeanAnnotationListener.parseAnnotatedClass(BeanAnnotationListener.java:45)
更改:
public class EmployeeDAO {
@PersistenceContext(unitName = "test-ejb", name = "persistence/em")
...
致:
EmployeeDAO必须是容器管理类(侦听器、筛选器、servlet、EJB、托管bean、CDI托管bean等),而不是POJO。JPA容器将只在容器管理的类上搜索JPA注释,而不是在POJO上 你的选择是:
@Stateless
注释添加到类中@PersistenceContext
注释移动到容器管理的类。例如,如果您有一个现有的侦听器、筛选器或servlet,请将注释移动到该类
添加到web.xml注意,您的应用程序服务器必须支持容器管理的JPA才能使这些方法发挥作用。请添加完整的例外情况report@ZaheerKhorajiya我已经包括了异常跟踪。我已经按照你的建议做了,但是当我在EmployeeDAO中添加@Stateless时,我得到了
javax.ejb.EJBException:Setter注入应用于非Setter方法:
在更新1部分的问题中添加了完整的错误堆栈跟踪。Thanks@user75ponic您缺少(或删除了?)em字段。试试PersistenceContext(unitName=“test ejb”,name=“persistence/em”)私有实体管理器em代码>我添加了私有实体管理器em
正如yu所建议的,这导致了NameNotFoundException
我在调试时发现了另一个异常,它是com.evermind[Oracle Containers for J2EE 10g(10.1.3.5.0)].server.ejb.exception.DeploymentException:[当前工作区应用程序:ejbsession]-名为“test ejb”的未知持久化单元。在com.evermind[Oracle Containers for J2EE 10g(10.1.3.5.0)
上,您的persistence.xml是否在WAR的WEB-INF/classes/META-INF/
文件夹中?如果是,那么我不知道出了什么问题。我已经按照您的建议进行了尝试,但是在emp=employeeDAO.getEmployees();
public class EmployeeDAO {
@PersistenceContext(unitName = "test-ejb", name = "persistence/em")
...
@PersistenceContext(unitName = "test-ejb", name = "persistence/em")
@Stateless
public class EmployeeDAO {
...