2011-11-10 118 views
0

我正在部署到Glassfish 3.1.1。JPA/GlassFish 3 - NamingException將EJB注入servlet

我有一個創建jar的JPA項目。它有用@Entity標註的標準數據模型類和用@Stateless標註的服務類。服務類都從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); 
    } 
} 

我已經設置了GlassFish中的JDBC連接池,並能成功地ping數據庫(MySQL的)。我設置了與資源池關聯的JDBC資源jdbc/myUnitName。因爲我在池中設置了URL,用戶,密碼等屬性,所以我沒有將它們添加到資源中,也沒有將它們包含在persitence.xml中。它看起來像這樣:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
    <persistence-unit name="myUnitName"> 
     <jta-data-source>jdbc/myUnitName</jta-data-source> 
     <properties> 
      <property name="eclipselink.logging.level" value="FINE" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

我到我要注入服務bean的一個servlet:

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"); 

    } 
} 

當我嘗試部署servlet的戰爭,我在我的籌碼得到了這最後的Caused by trace:

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]]] 

我不知道我在代碼或配置中做了什麼錯誤,導致此問題。任何幫助調試將非常感謝!

回答

1

我認爲您必須使用@Stateless註釋來註釋您的BatchService類,以使其注射。我不確定,但我認爲註釋不能被繼承。

+0

是的,這是問題所在。謝謝! – sdoca

0

從另一個來源:

會話bean不能擴展會話bean

規範EJB核心4.6.2

會話bean類可以有超類和/或超接口。 會話bean類絕不能有一個本身就是會話bean類的超類。