2015-09-16 3 views
0

Я пытаюсь использовать Container Managed EntityManager, однако я получаю NameNotFoundException. Я попытался добавить записи в web.xml, но напрасно.NameNotFoundException в контейнере Управляемый EntityManager

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

стек Исключение

javax.naming.NameNotFoundException: сохранение/эм не нашли на ком. evermind [O raquet Containers for J2EE 10g (10.1.3.5.0)] .server.rmi.RMIServerContext.lookup (RMIServerContext.java:207) at com.evermind [Oracle Containers for J2EE 10g (10.1.3.5.0)] .сервер. ApplicationContext.unprivileged_lookup (ApplicationContext.java:256) at com.evermind [Контейнеры Oracle для J2EE 10g (10.1.3.5.0)] .server.ApplicationContext.lookup (ApplicationContext.java:196) в javax.naming.InitialContext. поиск (InitialContext.java:392) на test.dao.EmployeeDAO.getValues ​​(EmployeeDAO.java:39) на sun.reflect.NativeMethodAccessorImpl.invoke0 (нативный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java : 39) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) at java.lang.refl ect.Method.invoke (Method.java:597) на com.sun.jersey.spi.container.JavaMethodInvokerFactory $ 1.invoke (JavaMethodInvokerFactory.java:60) на com.sun.jersey.server.impl.model.method .dispatch.AbstractResourceMethodDispatchProvider $ TypeOutInvoker._dispatch (AbstractResourceMethodDispatchProvider.java:185) в com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch (ResourceJavaMethodDispatcher.java:75) в com.sun.jersey .server.impl.uri.rules.HttpMethodRule.accept (HttpMethodRule.java:302) at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept (RightHandPathRule.java:147) at com.sun .jersey.server.impl.uri.rules.ResourceClassRule.accept (ResourceClassRule.java:108) at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept (Rig htHandPathRule.java:147) на com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept (RootResourceClassesRule.java:84) на com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest (WebApplicationImpl.java:1511) at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest (WebApplicationImpl.java:1442) at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest (WebApplicationImpl. java: 1391) at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest (WebApplicationImpl.java:1381) at com.sun.jersey.spi.container.servlet.WebComponent.service (WebComponent.java: 416) на com.sun.jersey.spi.container.servlet.ServletContainer.service (ServletContainer.java:538) на com.su n.jersey.spi.container.servlet.ServletContainer.service (ServletContainer.java:716) at javax.servlet.http.HttpServlet.service (HttpServlet.java:856) at com.evermind [Контейнеры Oracle для J2EE 10g (10.1.3.5.0)] .server.http.ServletRequestDispatcher.invoke (ServletRequestDispatcher.java:734) at com.evermind [Контейнеры Oracle для J2EE 10g (10.1.3.5.0)] .server.http.ServletRequestDispatcher.forwardInternal (ServletRequestDispatcher.java:391) at com.evermind [Контейнеры Oracle для J2EE 10g (10.1.3.5.0)] .server.http.HttpRequestHandler.doProcessRequest (HttpRequestHandler.java: 908) at com.evermind [Oracle Containers for J2EE 10g (10.1.3.5.0)] .server.http.HttpRequestHandler.processRequest (HttpRequestHandler.java:458) at com.evermind [Контейнеры Oracle для J2EE 10g (10.1.3.5.0)] .server.http.HttpRequestHandler.serveOneRequest (HttpRequestHandler.java:226) at com.evermind [Контейнеры Oracle для J2EE 10g (10.1.3.5.0)] .server.http.HttpRequestHandler.run (HttpRequestHandler.java:127) at com.evermind [Контейнеры Oracle для J2EE 10g (10.1.3.5.0)] .server.http.HttpRequestHandler.run (HttpRequestHandler.java:116) at oracle.oc4j.network.ServerSocketReadHandler $ SafeRunnable.run (ServerSocketReadHandler.java:260) at com.evermind [Контейнеры Oracle для J2EE 10g (10.1.3.5.0)] .util.ReleasableResourcePooledExecutor $ MyWorker.run (ReleaseasableResourcePooledExecutor.java:303) в java.lang.Thread.run (Thread.java:662)

Обновление 1

@Stateless 
@LocalBean 
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); 
    } 

Исключение

javax.ejb.EJBException: сеттер инъекции применяется к способу без сеттера: getValues; вложенное исключение: java.lang.InstantiationException: сеттер инъекция применяется к методу без инкубационного: GetValues ​​

Полных стек

Вызванная: java.lang.InstantiationException: сеттер инъекции применяется к не -setter метод: GetValues ​​ на com.evermind.server.deployment.J2EEContextAnnotationParser.validateInjectionSetter (J2EEContextAnnotationParser.java:713) на com.evermind.server.deployment.J2EEContextAnnotationParser.createInjectionTarget (J2EEContextAnnotationParser.java:729) в com.evermind .server.deployment.J2EEContextAnnotationPa rser.parseInjectedMethod (J2EEContextAnnotationParser.java:378) на com.evermind.server.ejb.deployment.BeanDescriptorAnnotationParser.parseInjectedMethodAndCallbacks (BeanDescriptorAnnotationParser.java:276) в com.evermind.server.ejb.deployment.SessionBeanDescriptorAnnotationParser.parseInjectedMethodAndCallbacks (SessionBeanDescriptorAnnotationParser. Java: 95) в com.evermind.server.ejb.deployment.BeanDescriptorAnnotationParser.parseAnnotations (BeanDescriptorAnnotationParser.java:77) на com.evermind.server.ejb.deployment.BeanDescriptorAnnotationParser.parseAnnotations (BeanDescriptorAnnotationParser.java:48) на sun.reflect.NativeMethodAccessorImpl.invoke0 (родной метод) at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) at sun.reflec t.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke (Method.java:597) at com.evermind.server.ejb.BeanAnnotationListener.parseAnnotatedClass (BeanAnnotationListener.java:45)

+0

Пожалуйста, добавьте полный отчет об исключении –

+0

@ Зачерняя кошара Я включил след исключения. – user75ponic

ответ

1

Изменение:

public class EmployeeDAO { 
    @PersistenceContext(unitName = "test-ejb", name = "persistence/em") 
... 

к:

@PersistenceContext(unitName = "test-ejb", name = "persistence/em") 
@Stateless 
public class EmployeeDAO { 
... 
+0

Я попытался, как вы уже сказали, но я получаю 'NullPointerException' в' emp = employeeDAO.getEmployees(); ' – user75ponic

1

EmployeeDAO должен быть контейнером управляемого класса (слушатель, фильтр, сервлетов, EJB, управляемого bean, CDI управляемый bean и т. д.), а не POJO. Контейнер JPA будет искать только аннотации JPA для классов, управляемых контейнерами, а не POJO.

варианты:

  1. Изменение EmployeeDAO быть управляемой контейнером класса. Например, если ваш сервер приложений поддерживает EJB, добавьте в класс аннотацию @Stateless.
  2. Переместить аннотацию @PersistenceContext в управляемый контейнером класс. Например, если у вас есть существующий прослушиватель, фильтр или сервлет, переместите аннотацию в этот класс.
  3. Добавить <persistence-context-ref> в web.xml.

Обратите внимание: ваш сервер приложений должен поддерживать JPA, поддерживаемую контейнером, для любого из этих подходов к работе.

+0

Я сделал то, что было предложено вами, однако когда я добавил @Stateless в EmployeeDAO, я получаю' javax .ejb.EJBException: Инъекция сеттера применяется к методу, отличному от сеттера: «Полная трассировка стека ошибок добавлена ​​в мой вопрос в разделе« Обновление 1 ». Спасибо – user75ponic

+0

@ user75ponic Вам не хватает (или удалено?) Поля em. Попробуйте '@PersistenceContext (unitName =" test-ejb ", name =" persistence/em ") private EntityManager em;' –

+0

Я добавил 'private EntityManager em;', как я предположил, это привело к 'NameNotFoundException' – user75ponic