Java EE NameNotFoundException;

标签 java stateful-session-bean

我从我的 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>
}

这是我的项目结构:

enter image description here

最佳答案

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

  • 您正在使用 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/

相关文章:

java - 如何获取时区的本地日期时间

java - EJB Bean 与不同的未完成事务关联

Java EE 6 : How to call Stateful Session Bean from Stateless Session Bean?

java - 有状态 session bean 多线程访问

java - 有状态 EJB 和跨客户端复制的相同 session

java - 使用链表进行循环。输入不能使用多个进程

java - JSON 字符串到对象的映射

java - "ArrayAdapter requires the resource ID to be a TextView"有时在执行时

java - IE11 : Error 400 only on specific server