Jpa 容器管理的EntityManager中的NameNotFoundException

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

我试图使用容器管理的EntityManager,但是我得到了NameNotFoundException。我曾尝试在web.xml中添加条目,但没有成功

@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上

你的选择是:

  • 将EmployeeDAO更改为容器管理类。例如,如果您的应用程序服务器支持EJB,则将
    @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 {
    ...