我在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。有谁能告诉我如何解决这个问题?
答案 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