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:
Okay, from the information you've provided I can gather the following:
OPRSystem.java
that injects 4 EJBsOPRSystem.OPRSystem
looks like a bizarre inner class arrangement)@Remote
)Agent
EJB (presumably the others will also fail, this just happens to be the first one to be injected)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>
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?