title: Java EE NameNotFoundException;
body: <p>I am getting this injection/JNDI-lookup error from my Java EE web application:</p>
  
  <pre><code>type Exception report
  
  message
  
  descriptionThe server encountered an internal error () that prevented it from fulfilling this request.
  
  exception
  
  javax.servlet.ServletException: PWC1392: Error instantiating servlet class OPRSystem.OPRSystem
  root cause
  
  com.sun.enterprise.container.common.spi.util.InjectionException: Error creating managed object for class: class OPRSystem.OPRSystem
  root cause
  
  com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Remote ejb-ref name=OPRSystem.OPRSystem/agent,Remote 3.x interface =AccountManager.Agent,ejb-link=null,lookup=,mappedName=,jndi-name=AccountManager.Agent,refType=Session into class OPRSystem.OPRSystem: Lookup failed for 'java:comp/env/OPRSystem.OPRSystem/agent' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming}
  root cause
  
  javax.naming.NamingException: Lookup failed for 'java:comp/env/OPRSystem.OPRSystem/agent' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=OPRSystem.OPRSystem/agent,Remote 3.x interface =AccountManager.Agent,ejb-link=null,lookup=,mappedName=,jndi-name=AccountManager.Agent,refType=Session' .  Actual (possibly internal) Remote JNDI name used for lookup is 'AccountManager.Agent#AccountManager.Agent' [Root exception is javax.naming.NamingException: Lookup failed for 'AccountManager.Agent#AccountManager.Agent' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: AccountManager.Agent#AccountManager.Agent not found]]]
  root cause
  
  javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=OPRSystem.OPRSystem/agent,Remote 3.x interface =AccountManager.Agent,ejb-link=null,lookup=,mappedName=,jndi-name=AccountManager.Agent,refType=Session' .  Actual (possibly internal) Remote JNDI name used for lookup is 'AccountManager.Agent#AccountManager.Agent' [Root exception is javax.naming.NamingException: Lookup failed for 'AccountManager.Agent#AccountManager.Agent' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: AccountManager.Agent#AccountManager.Agent not found]]
  root cause
  
  javax.naming.NamingException: Lookup failed for 'AccountManager.Agent#AccountManager.Agent' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: AccountManager.Agent#AccountManager.Agent not found]
  root cause
  
  javax.naming.NameNotFoundException: AccountManager.Agent#AccountManager.Agent not found
  </code></pre>
  
  <p>Not sure what code to paste here, please let me know, thanks.</p>
  
  <p>Here's my web.xml:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  &lt;web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"&gt;
      &lt;servlet&gt;
          &lt;servlet-name&gt;OPRSystem&lt;/servlet-name&gt;
          &lt;servlet-class&gt;OPRSystem.OPRSystem&lt;/servlet-class&gt;
      &lt;/servlet&gt;
      &lt;servlet-mapping&gt;
          &lt;servlet-name&gt;OPRSystem&lt;/servlet-name&gt;
          &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;
      &lt;/servlet-mapping&gt;
      &lt;session-config&gt;
          &lt;session-timeout&gt;
              30
          &lt;/session-timeout&gt;
      &lt;/session-config&gt;
  &lt;/web-app&gt;
  </code></pre>
  
  <p>This is my action class that intanties the ejbs:</p>
  
  <pre><code>package OPRSystem;
  
  import AccountManager.Agent;
  import AccountManager.Customer;
  import AccountManager.Owner;
  import RentalManager.FinancialInstitution;
  import javax.servlet.http.HttpServletRequest; 
  
  /**
   *
   * @author ssome
   */
  public abstract class Action {
      private final String successpage;
      private final String failpage;
      protected Agent agent;
      protected Customer customer;
      protected Owner owner;
      protected FinancialInstitution fi;
  
      public Action(String success, String fail) {
          this.successpage = success;
          this.failpage = fail;
      }
      public abstract String perform(HttpServletRequest req);
  
      /**
       * @return the successpage
       */
      public String getSuccesspage() {
          return successpage;
      }
  
      /**
       * @return the failpage
       */
      public String getFailpage() {
          return failpage;
      }
  
      /**
       * @param agent the agent to set
       */
      public void setAgent(Agent agent) {
          this.agent = agent;
      }
  
      /**
       * @param customer the customer to set
       */
      public void setCustomer(Customer customer) {
          this.customer = customer;
      }
  
      /**
       * @param owner the owner to set
       */
      public void setOwner(Owner owner) {
          this.owner = owner;
      }
  
      /**
       * @param fi the fi to set
       */
      public void setFi(FinancialInstitution fi) {
          this.fi = fi;
      }
  
  }
  </code></pre>
  
  <p>Here's my OPRSystem class:</p>
  
  <pre><code>package OPRSystem;
  
  import AccountManager.Agent;
  import AccountManager.Customer;
  import AccountManager.Owner;
  import RentalManager.FinancialInstitution;
  import java.io.IOException;
  import java.util.HashMap;
  import javax.ejb.EJB;
  import javax.servlet.RequestDispatcher;
  import javax.servlet.ServletException;
  import javax.servlet.annotation.WebServlet;
  import javax.servlet.http.HttpServlet;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  
  @WebServlet(name="OPRSystem", urlPatterns={"*.do"}) 
  public class OPRSystem extends HttpServlet {
  
      @EJB
      private Agent agent;
  
      @EJB
      private Customer customer;
  
      @EJB
      private Owner owner;
  
      @EJB
      private FinancialInstitution fi;
  
      private HashMap&lt;String,Action&gt; actions;
  
      @Override
      public void init() throws ServletException {
          java.util.Date date = new java.util.Date();
          java.sql.Date sqlDate = new java.sql.Date(date.getTime());
          java.sql.Time sqlTime = new java.sql.Time(date.getTime());
          agent.createAdmin(sqlDate, sqlTime);
  
          actions = new HashMap&lt;String,Action&gt;();
          LoginAction la = new LoginAction("/Welcome.jsp", "/index.jsp");
          la.setAgent(agent);
          la.setCustomer(customer);
          la.setOwner(owner);
          actions.put("login", la);
      }
  
      /**
       * Processes requests for both HTTP &lt;code&gt;GET&lt;/code&gt; and &lt;code&gt;POST&lt;/code&gt; methods.
       * @param request servlet request
       * @param response servlet response
       * @throws ServletException if a servlet-specific error occurs
       * @throws IOException if an I/O error occurs
       */
      protected void processRequest(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
          String next = "";
          String op = getOperation(request.getRequestURL());
          Action act = actions.get(op);
          if (act != null) {
              next = act.perform(request);
          }
  
          // Get the dispatcher
          RequestDispatcher dispatcher =
                 getServletContext().getRequestDispatcher(next);
  
  
          if (dispatcher != null)
                 dispatcher.forward(request, response);
      }
  
      public String getOperation(StringBuffer requestURL) {
          int lastslash = requestURL.lastIndexOf("/");
          int lastdot = requestURL.lastIndexOf(".");
          String op = requestURL.substring(lastslash+1, lastdot);
          return op;
      }
  
      // &lt;editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."&gt;
      /** 
       * Handles the HTTP &lt;code&gt;GET&lt;/code&gt; method.
       * @param request servlet request
       * @param response servlet response
       * @throws ServletException if a servlet-specific error occurs
       * @throws IOException if an I/O error occurs
       */
      @Override
      protected void doGet(HttpServletRequest request, HttpServletResponse response)
              throws ServletException, IOException {
          processRequest(request, response);
      }
  
      /** 
       * Handles the HTTP &lt;code&gt;POST&lt;/code&gt; method.
       * @param request servlet request
       * @param response servlet response
       * @throws ServletException if a servlet-specific error occurs
       * @throws IOException if an I/O error occurs
       */
      @Override
      protected void doPost(HttpServletRequest request, HttpServletResponse response)
              throws ServletException, IOException {
          processRequest(request, response);
      }
  
      /** 
       * Returns a short description of the servlet.
       * @return a String containing servlet description
       */
      @Override
      public String getServletInfo() {
          return "Short description";
      }// &lt;/editor-fold&gt;
  }
  </code></pre>
  
  <p>Here's my project structure:</p>
  
  <p><img src="https://i.stack.imgur.com/C4KHY.png" alt="enter image description here"></p>