EJB 查找问题
EJB lookup issue
我有一个 Web 项目,其中有几个 EJB 在不同的包中。但是我在查找 EJB 时遇到了问题。
我的目录结构:有两个包 index.job 和 index.ejb.
-- 包 index.job 有一个 POJO index.java
-- 包 index.ejb 有一个由 @Stateless(name = "indexEJB", mappedName = "indexEJB") 和 @LocalBean
-- 包 index.ejb 还定义了一个本地 ejb 接口 @Local
我的本地 Bean
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; JDK1.8b45; Java EE 7 网络; WebLogic 12.2.1.1
无论何时将 bean 注释为 @LocalBean,使 bean 公开无接口视图,查找返回的引用将是对 EJB class 的引用,而不是接口。 @LocalBean 注释公开了 EJB 实现中的所有方法,而不仅仅是接口中定义的方法。
您遇到的异常可能告诉您没有具有 IndexEJBLocal 视图的 bean。
您最简单的解决方案是删除 @LocalBean 注释,我相信这就是您想要的。
我有一个 Web 项目,其中有几个 EJB 在不同的包中。但是我在查找 EJB 时遇到了问题。
我的目录结构:有两个包 index.job 和 index.ejb.
-- 包 index.job 有一个 POJO index.java
-- 包 index.ejb 有一个由 @Stateless(name = "indexEJB", mappedName = "indexEJB") 和 @LocalBean
-- 包 index.ejb 还定义了一个本地 ejb 接口 @Local
我的本地 Bean
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; JDK1.8b45; Java EE 7 网络; WebLogic 12.2.1.1
无论何时将 bean 注释为 @LocalBean,使 bean 公开无接口视图,查找返回的引用将是对 EJB class 的引用,而不是接口。 @LocalBean 注释公开了 EJB 实现中的所有方法,而不仅仅是接口中定义的方法。
您遇到的异常可能告诉您没有具有 IndexEJBLocal 视图的 bean。
您最简单的解决方案是删除 @LocalBean 注释,我相信这就是您想要的。