2011-11-10 7 views
0

Glassfish 3.1.1にデプロイしています。JPA/Glassfish 3 - ServletにEJBを注入するNamingException

私は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接続プールを設定していると、正常データベース(MySQLを)pingを実行することができます。プールに関連付けられたJDBCリソースjdbc/myUnitNameをセットアップしました。プールにURL、ユーザー、パスワードなどのプロパティを設定しているため、リソースに追加したり、persitence.xmlに追加したりしませんでした。これは次のようになります。私は、サーブレットの戦争を展開しようとすると、私は私のスタックでこの最終Caused byを取得し、

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

    } 
} 

<?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を先にサーブレットを持っていますトレース:

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

あなたのBatchServiceクラスに、@Stateless注釈を注釈を付けて注射可能にしなければならないと思います。私は確信していませんが、注釈は継承できないと思います。別のソースから

+0

はい、これが問題でした。ありがとう! – sdoca

0

セッションBeanがセッションBeanを拡張することはできません

スペックEJBコア4.6.2

セッションBeanクラスは、スーパークラスおよび/またはスーパーインタフェースを有することができます。 セッションBeanクラスは、セッションBeanクラスであるスーパークラスを持つことはできません。

関連する問題