【问题标题】:EJB lookup issueEJB 查找问题
【发布时间】:2016-10-07 16:58:41
【问题描述】:

我有一个 Web 项目,其中有几个 EJB 在不同的包中。但是我在查找 EJB 时遇到了问题。

我的目录结构:有两个包index.jobindex.ejb

-- 包index.job有一个POJO index.java

-- 包 index.ejb 有一个由 @Stateless(name = "indexEJB", mappedName = "indexEJB")@LocalBean

定义的 ejb

-- 包index.ejb也定义了本地ejb接口@Local

我的本地豆

package index.ejb;

import java.util.ArrayList;
import javax.ejb.Local;

@Local
public interface IndexEJBLocal {
    public ArrayList getLatestVersions(String year, int start, int end);
}

我的 EJB

package index.ejb;

import javax.ejb.Stateless;
import javax.annotation.Resource;
import javax.ejb.LocalBean;

@Stateless(name = "indexEJB", mappedName = "indexEJB")
@LocalBean
public class IndexEJB implements IndexEJBLocal {

    @Resource(lookup = "jdbc/cap")
    private DataSource ds;

    @Override
    public ArrayList getLatestVersions(String year, int start, int end) {
        return null;
    }
}

我的 POJO

//ADDED @ManagedBean ANNOTATION SO SERVER IDENTIFIES THIS OBJ AS A RESOURCE
//Also cannot use @PostConstruct as the execute method is overridden from quartz job interface

package index.job;

import javax.annotation.ManagedBean;
import javax.ejb.EJB;
import javax.inject.Inject;

@ManagedBean
public class IndexJob implements Job {

    @EJB
    IndexEJB billIndexEJB1;

    @EJB
    IndexEJBLocal billIndexEJB2;

    @Inject
    IndexEJB billIndexEJB3;

    @Inject
    IndexEJBLocal billIndexEJB4;

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {

        System.out.println("1::"+billIndexEJB1); //ALWAYS NULL
        System.out.println("2::"+billIndexEJB2); //ALWAYS NULL
        System.out.println("3::"+billIndexEJB3); //ALWAYS NULL
        System.out.println("4::"+billIndexEJB4); //ALWAYS NULL


        try {
            Context ctx = new InitialContext();
            IndexEJBLocal billIndex = (IndexEJBLocal) 
                ctx.lookup("java:global.MY-PROJECT-NAME.IndexEJB!index.ejb.IndexEJBLocal");

            //ABOVE LOOKUP ALWAYS FAILS WITH NameNotFoundException

            System.out.println("billIndex::" + billIndex);
        } catch (Exception e) {
        e.printStackTrace();
        }
    }
}

任何有关如何解决此问题的提示将不胜感激。

我的项目正在运行:NetBeans 8.2; JDK 1.8b45; Java EE 7 网络; WebLogic 12.2.1.1

【问题讨论】:

  • 你有什么问题?上下文查找错误?如果是,请尝试查看启动日志,如果部署正确,Web 逻辑应该会通知您可以调用 EJB 的 JNDI 名称。
  • 谢谢!我查看了启动日志,它有所帮助。我必须将查找路径更新为 java:module/IndexEJB!index.ejb.IndexEJB 并删除接口。

标签: jakarta-ee annotations jndi lookup ejb-3.1


【解决方案1】:

每当您将 bean 注释为 @LocalBean 时,使 bean 公开一个无接口视图,查找返回的引用将是对 EJB 类而不是接口的引用。 @LocalBean 注释公开了 EJB 实现中的所有方法,而不仅仅是接口中定义的方法。

您得到的异常可能是告诉您没有具有 IndexEJBLocal 视图的 bean。

您最简单的解决方案是删除 @LocalBean 注释,我相信这是您想要的。

【讨论】:

  • 谢谢!我已经删除了接口并使用查找直接初始化了 EJB。但是我必须将查找路径更新为 java:module/IndexEJB!index.ejb.IndexEJB
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 2011-03-25
  • 2014-10-21
  • 1970-01-01
相关资源
最近更新 更多