Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA/Glassfish 3-NamingException将EJB注入servlet_Exception_Jakarta Ee_Jpa_Dependency Injection_Glassfish 3 - Fatal编程技术网

JPA/Glassfish 3-NamingException将EJB注入servlet

JPA/Glassfish 3-NamingException将EJB注入servlet,exception,jakarta-ee,jpa,dependency-injection,glassfish-3,Exception,Jakarta Ee,Jpa,Dependency Injection,Glassfish 3,我正在部署Glassfish 3.1.1 我有一个创建jar的JPA项目。它有用@实体注释的标准数据模型类和用@无状态注释的服务类。服务类都继承自GenericServiceBean类: @Stateless public class GenericServiceBean implements GenericService { @PersistenceContext(unitName = "myUnitName") EntityManager em; public Ge

我正在部署Glassfish 3.1.1

我有一个创建jar的JPA项目。它有用
@实体
注释的标准数据模型类和用
@无状态
注释的服务类。服务类都继承自GenericServiceBean类:

@Stateless
public class GenericServiceBean implements GenericService
{
    @PersistenceContext(unitName = "myUnitName")
    EntityManager em;

    public GenericServiceBean()
    {
        // empty
    }

    public <T> T create(T t)
    {
        em.persist(t);   
        return t;
    }

    public <T> T update(T t)
    {
        return em.merge(t);
    }

    public List<?> findWithNamedQuery(String namedQueryName,
            Map<String, Object> parameters)
    {
        return findWithNamedQuery(namedQueryName, parameters, 0);
    }

    public List<?> findWithNamedQuery(String namedQueryName,
            Map<String, Object> parameters, int resultLimit)
    {
        Query query = this.em.createNamedQuery(namedQueryName);

        if (resultLimit > 0)
        {
            query.setMaxResults(resultLimit);
        }

        for (Map.Entry<String, Object> entry : parameters.entrySet())
        {
            query.setParameter(entry.getKey(), entry.getValue());
        }

        return query.getResultList();
    }
}

public class BatchService extends GenericServiceBean
{
    public BatchService()
    {
        super();
    }

    public Batch create(Batch batch)
    {
        return this.create(batch);
    }

    public Batch find(Batch batch)
    {
        return this.update(batch);
    }

    public List<Batch> findByStatus(String status)
    {
        HashMap<String, Object> parameters = new HashMap<String, Object>();
        parameters.put("status", status);

        return (List<Batch>) this.findWithNamedQuery("Batch.findByStatus",
                parameters);
    }
}
我有一个servlet,希望将服务bean注入其中:

public class ESwimConnectivityServlet extends HttpServlet
{
    @EJB
    private BatchService batchService; 

    @Override
    protected void service(HttpServletRequest request,
        HttpServletResponse response)
        throws ServletException, IOException
    {
        log.debug("Enter service()");
        this.processRequest(request, response);
        log.debug("Exit service()");

    String message = ("Connecting to database: ");

    try
    {
        List<Batch> batches = batchService.findByStatus(ProcessingStatusEnum.SUCCESS.toString());
        message += "SUCESS - batch query returned " + batches.size();
    }
    catch (Throwable t)
    {
        message += "FAIL - see log for details";
        log.error("Could not query database", t);
    }

    response.getWriter().write(message + "\n");

    }
}

我不知道我在代码或配置中做错了什么导致了这个问题。任何帮助调试都将不胜感激

我认为您必须使用
@Stateless
注释对
BatchService
类进行注释,以使其可注入。我不确定,但我认为注释无法继承。

来自其他来源:

会话bean无法扩展会话bean

规范EJB核心4.6.2

会话bean类可能有超类和/或超接口。
会话bean类不能有本身就是会话bean类的超类。

是的,这就是问题所在。谢谢
public class ESwimConnectivityServlet extends HttpServlet
{
    @EJB
    private BatchService batchService; 

    @Override
    protected void service(HttpServletRequest request,
        HttpServletResponse response)
        throws ServletException, IOException
    {
        log.debug("Enter service()");
        this.processRequest(request, response);
        log.debug("Exit service()");

    String message = ("Connecting to database: ");

    try
    {
        List<Batch> batches = batchService.findByStatus(ProcessingStatusEnum.SUCCESS.toString());
        message += "SUCESS - batch query returned " + batches.size();
    }
    catch (Throwable t)
    {
        message += "FAIL - see log for details";
        log.error("Could not query database", t);
    }

    response.getWriter().write(message + "\n");

    }
}
Caused by: javax.naming.NamingException: 
Lookup failed for 'java:comp/env/com.mycompany.MyServlet/batchService' 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=com.mycompany.MyServlet/batchService,Remote 3.x interface =com.mycompany.service.BatchService,ejb-link=null,lookup=,mappedName=,jndi-name=com.mycompany.service.BatchService,refType=Session' .  Actual (possibly internal) Remote JNDI name used for lookup is 'com.mycompany.service.BatchService#com.mycompany.service.BatchService'
[Root exception is javax.naming.NamingException: Lookup failed for 'com.mycompany.service.BatchService#com.mycompany.service.BatchService' 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: com.mycompany.service.BatchService#com.mycompany.service.BatchService not found]]]