我从我的 Java EE Web 应用程序中收到此注入(inject)/JNDI 查找错误:
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
不确定要在此处粘贴什么代码,请告诉我,谢谢。
这是我的 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>
这是我的操作类,它实例化了 ejb:
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;
}
}
这是我的 OPRSystem 类:
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>
}
这是我的项目结构:
最佳答案
好的,根据您提供的信息,我可以收集以下信息:
- 您正在使用 Glassfish
- 您有一个 Servlet,
OPRSystem.java
注入(inject) 4 个 EJB - 使用 @EJB 注入(inject) EJB(注释上不使用任何属性)
- 您的 web.xml 文件不包含 EJB 引用
- 您的 EJB 接口(interface)是远程的(即用
OPRSystem.OPRSystem
进行注释) - 您的 EJB 部署在同一个 EAR 中(这是一个假设)
- 您的应用程序无法注入(inject)
@Remote
EJB(想必其他的也会失败,这恰好是第一个被注入(inject)的) - 它无法查找的 JNDI 名称是
Agent
。根据Glassfish EJB FAQ这是一个正确的引用,作为使用java:comp/env/OPRSystem.OPRSystem/agent
时的默认 ejb-ref田野上是@EJB
- 根据同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.
您能否确认您的 EJB 部署在同一个应用程序中?
您能在服务器日志中看到它们正确启动的证据吗?
关于Java EE NameNotFoundException;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8394945/