Java EE NameNotFoundException;

时间:2011-12-06 03:18:26

标签: java stateful-session-bean

我从Java EE Web应用程序中收到此注入/ 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>

这是我的动作类,它吸引了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;
    }

}

这是我的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>
}

这是我的项目结构:

enter image description here

1 个答案:

答案 0 :(得分:1)

好的,根据您提供的信息,我可以收集以下内容:

  • 您正在使用Glassfish
  • 你有一个Servlet,OPRSystem.java注入了4个EJB
  • 你的包名是令人厌恶的 - 它们应该都是小写的;)它也使堆栈痕迹难以阅读(OPRSystem.OPRSystem看起来像一个奇怪的内部类安排)
  • 使用@EJB注入EJB(注释上不使用任何属性)
  • 您的web.xml文件不包含EJB引用
  • 您的EJB接口是远程的(即使用@Remote注释)
  • 您的EJB部署在同一个EAR中(这是一个假设)
  • 您的应用程序无法注入Agent EJB(可能其他人也会失败,这恰好是第一个注入的)
  • 无法查找的JNDI名称为java:comp/env/OPRSystem.OPRSystem/agent。根据{{​​3}},这是一个正确的引用,因为在字段上使用@EJB时默认的ejb-ref为<fully-qualified name of declaring class>/<field-name>
  • 根据相同的Glassfish EJB FAQ
  

如果目标EJB组件在同一个应用程序中定义   您的引用组件,并且只有一个目标EJB组件   在公开与之关联的远程接口的应用程序中   使用EJB依赖关系,然后映射将自动发生。   在这种情况下,无需指定任何其他映射   信息。

您能确认您的EJB是否部署在同一个应用程序中?

你能看到他们在服务器日志中正确启动的证据吗?