0

I am getting this injection/JNDI-lookup error from my Java EE web application:

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

Not sure what code to paste here, please let me know, thanks.

Here's my web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <servlet>
        <servlet-name>OPRSystem</servlet-name>
        <servlet-class>OPRSystem.OPRSystem</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>OPRSystem</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

This is my action class that intanties the ejbs:

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;
    }

}

Here's my OPRSystem class:

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<String,Action> 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<String,Action>();
        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 <code>GET</code> and <code>POST</code> 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;
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> 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 <code>POST</code> 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";
    }// </editor-fold>
}

Here's my project structure:

enter image description here

0xSina
  • 20,973
  • 34
  • 136
  • 253
  • It would be useful to see how your EJB is injected in your servlet, as well as any additional configuration related to the JNDI binding for the EJB (e.g. web.xml). I'd hazard a guess that either your EJB is not being bound to the expected JNDI name, or the reference in your web project isn't configured correctly. – James Bassett Dec 06 '11 at 04:06
  • Hey, thanks for reply. I added my web.xml, and action class. – 0xSina Dec 06 '11 at 04:18
  • This information is not helpful. As commented before, we need to see how your EJB is injected in your servlet. Are you actually understanding what this code is doing? To understand your position better, is it your code? Or is it someone else's project and you're been thrown in the depth? Or is it an altogether cobbled piece of copypasted snippets you found on Internet which you already don't understand individually? – BalusC Dec 06 '11 at 04:25
  • Oh dear, is the package really `OPRSystem`? So the fully qualified name of your servlet is `OPRSystem.OPRSystem`? As stated above we really need to see your servlet (`OPRSystem.java`) with the `@EJB` annotations. – James Bassett Dec 06 '11 at 04:50
  • Hound Dog, I edited my original post with the OPRSystem class – 0xSina Dec 06 '11 at 05:06

1 Answers1

1

Okay, from the information you've provided I can gather the following:

  • You're using Glassfish
  • You've got a Servlet, OPRSystem.java that injects 4 EJBs
  • Your package names are an abomination - they should be all lowercase ;) It also makes the stacktraces hard to read (OPRSystem.OPRSystem looks like a bizarre inner class arrangement)
  • The EJBs are injected using @EJB (no attributes are used on the annotation)
  • Your web.xml file contains no EJB references
  • Your EJB interfaces are remote (i.e. annotated with @Remote)
  • Your EJBs are deployed in the same EAR (that's an assumption)
  • Your application is failing to inject the Agent EJB (presumably the others will also fail, this just happens to be the first one to be injected)
  • The JNDI name it's failing to look up is java:comp/env/OPRSystem.OPRSystem/agent. According to the Glassfish EJB FAQ this is a correct reference, as the default ejb-ref when using @EJB on a field is <fully-qualified name of declaring class>/<field-name>
  • According to the same FAQ:

If the target EJB component is defined within the same application as your referencing component and there is only one target EJB component within the application that exposes the remote interface associated with your EJB dependency, then the mapping will happen automatically. In this case, there is no need to specify any additional mapping information.

Can you confirm that your EJBs are deployed in the same application?

And can you see evidence that they are starting up correctly in the server logs?

James Bassett
  • 9,458
  • 4
  • 35
  • 68
  • Yes, the EJBs are deployed in the same application. Please check my original question, I edited it. – 0xSina Dec 06 '11 at 20:54
  • Okay. Is `Agent` the EJB and `AgentLocal` the (local) interface that `Agent` implements? It would help to see 1) the Agent EJB class, including the class-level annotations, 2) the interface class it implements, 3) any EJB binding file (e.g. sun-ejb-jar.xml) – James Bassett Dec 06 '11 at 22:17