Glassfish3中的远程接口查找问题

时间:2010-05-21 07:21:40

标签: glassfish ejb-3.0 jndi glassfish-3

我在glassfish3上部署了一个带有actionclasses和facade的war文件,以及一个带有ejb-components(无状态bean,几个实体和一个persistence.xml)的jar文件。我的问题是我无法从我的门面找到无状态bean的远程接口。

我的bean和界面如下:

@Remote
public interface RecordService {...


@Stateless(name="RecordServiceBean", mappedName="ejb/RecordServiceJNDI")
public class RecordServiceImpl implements RecordService {

 @PersistenceContext(unitName="record_persistence_ctx")
 private EntityManager em;...

如果我查看server.log,便携式jndi看起来像:

Portable JNDI names for EJB RecordServiceBean : [java:global/recordEjb/RecordServiceBean, java:global/recordEjb/RecordServiceBean!domain.service.RecordService]|#]

和我的门面:

...InitialContext ctx= new InitialContext();
    try{
       recordService = (RecordService) ctx.lookup("java:global/recordEjb/RecordServiceBean!domain.service.RecordService");
      }
      catch(Throwable t){
       System.out.println("ooops");
       try{
        recordService = (RecordService)ctx.lookup("java:global/recordEjb/RecordServiceImpl");
       }
       catch(Throwable t2){
        System.out.println("noooo!");
       }...



  }

当外观进行第一次调用时,会发生此异常:

javax.naming.NamingException: Lookup failed for 'java:global/recordEjb/RecordServiceBean!domain.service.RecordService' in SerialContext  [Root exception is javax.naming.NamingException: ejb ref resolution error for remote business interfacedomain.service.RecordService [Root exception is java.lang.ClassNotFoundException: domain.service.RecordService]]

和第二个电话:

javax.naming.NamingException: Lookup failed for 'java:global/recordEjb/RecordServiceBean' in SerialContext  [Root exception is javax.naming.NamingException: ejb ref resolution error for remote business interfacedomain.service.RecordService [Root exception is java.lang.ClassNotFoundException: domain.service.RecordService]]

我还测试了使用@ EJB-annotation注入bean:

@EJB(name="RecordServiceBean")
 private RecordService recordService;

但这也不起作用。我错过了什么?我尝试使用ejb-jar.xml,但这不应该是nessesary。有谁能告诉我如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

我找到了解决这个问题的方法。如果我将接口文件打包在jar文件中并将该jar文件放入warfile中的WEB-INF / lib中,问题就解决了。

答案 1 :(得分:0)

当服务器启动时,接口的全局jndi名称将显示在控制台中。 使用它们来查找接口,而不是通过明确地给出名称来调用它们。

答案 2 :(得分:0)

您是否尝试过评论所有 xml文件的ejb相关部分,然后只使用

@Stateless
public class RecordServiceImpl implements RecordService {

and then 

@EJB
private RecordService recordService;

他们试图在EJB 3.1中使这个过程相当大脑死亡 此外,虽然JNDI浏览没有进入gf 3.0,你可以用

挖掘一些信息
asadmin list-jndi-entries --context java:global/yourAppName