EJB 未使用 @EJB 在 Wildfly 9.0.0 中初始化
EJB not initializing in Wildfly 9.0.0 using @EJB
我正在尝试从 EJB2.x 迁移到 EJB3.x,并且我使用的是 Wildfly 9.0.0。
旧的 EJB2.x 在 JBoss 4.2.2 中工作,这就是它的样子:
public interface WUFFacadeRemote extends EJBObject {
public ClientData getItems(ClientData data);
public ClientData save(ClientData data);
}
public interface WUFFacadeHome extends EJBHome {
public WUFFacadeRemote create();
}
public class WUFFacade {
public ClientData getItems(ClientData data) {
//code here
}
public ClientData save(ClientData data) {
//code here
}
}
public class WUFAction extends HttpServlet implements IAction {
public void doPost(HttpServletRequest request, HttpServletResponse response) {
...
Object objRef = ic.lookup("java:comp/env/wUF");
com.wuf.WUFFacadeHome home = (com.wuf.WUFFacadeHome) PortableRemoteObject.narrow(objRef, com.wuf.WUFFacadeHome.class);
engine = home.create();
//engine gets the reference, and I can use it normally.
...
}
}
我也有 ejb-jar.xml,它正在运行。现在,我想 EJB3.x 和 Wildfly 9.0.0 的解决方案如下:
@WebServlet(urlPatterns = "windows/wUF.do", loadOnStartup = 1)
public class WUFAction extends HttpServlet implements IAction {
@EJB
private WUFFacadeRemote engine;
public void doPost(HttpServletRequest request, HttpServletResponse response) {
//Here I should be able to use my engine.
//Wildfly starts and I call the page, engine is not null at this moment,
//but after I call the page again, it becomes null and remains null.
}
}
@Stateless
@Remote(WUFFacadeRemote.class)
public class WUFFacade extends RootFacade implements WUFFacadeRemote, Serializable {
public WUFFacade() { }
@EJB
FUFHome home;
public ClientData getItems(ClientData data) {
//code here
}
public ClientData save(ClientData data) {
//code here
}
private Col load(ClientData data,InitialContext ic) {
//here i'm calling home.
// but home is always null. It was supposed to have the @EJB reference initialized.
//But instead I get a null pointer...
home.findByFilter(loader);
}
}
@Remote(FUFHome.class)
public interface FUFHome {
FUF create(FUFValue fUFValue);
FUF findByPrimaryKey(FUFPK pk);
Collection findByFilter(FacadeLoader loader);
}
public interface WUFFacadeRemote{
public ClientData getItems(ClientData data);
public ClientData save(ClientData data);
}
我不再有 ejb-jar.xml,部署已成功完成,Wildfly 开始时没有错误。然后我第一次调用有问题的页面时,@EJB 似乎正在工作(调试是 "Proxy for remote EJB StatelessEJBLocator for "bus-facade/WUFFacade”,视图是接口 com.wuf.WUFFacadeRemote,亲和力是 None” ),该值不为空,但对于所有后续调用,我的变量为空并且我得到了 NullPointerException。
我真的不知道我做错了什么(也许我完全迷路了),但对我来说,@EJB 应该像那样正常工作。我错过了什么?谢谢
因为我正在使用 EJB3.x 我现在只是在使用注释,(这似乎没问题)。
JNDI:
部署中名为 FUF 的会话 bean 的 JNDI 绑定
java:global/fumo/bus-entities-fumo/FUF!apyon.components.fumo.fuf.FUF
java:app/bus-entities-fumo/FUF!apyon.components.fumo.fuf.FUF
java:module/FUF!apyon.components.fumo.fuf.FUF
java:global/fumo/bus-entities-fumo/FUF
java:app/bus-entities-fumo/FUF
java:module/FUF
名为 WUFFacade 的会话 bean 的 JNDI 绑定
java:global/fumo/bus-facade-fumo/WUFFacade!apyon.fumo.wuf.WUFFacadeRemote
java:app/bus-facade-fumo/WUFFacade!apyon.fumo.wuf.WUFFacadeRemote
java:module/WUFFacade!apyon.fumo.wuf.WUFFacadeRemote
java:jboss/exported/fumo/bus-facade-fumo/WUFFacade!apyon.fumo.wuf.WUFFacadeRemote
java:global/fumo/bus-facade-fumo/WUFFacade
java:app/bus-facade-fumo/WUFFacade
java:module/WUFFacade
我想我找到了解决问题的可能方法。我仍然会尝试找到另一个,但到目前为止还不错。
更改为 .war 并将我的其他项目保留在 .ears 中后,它正在运行。也许问题是因为我的 main.ear 中有一个 RootController servlet,它是应用程序的起点。上下文从那里开始,然后重定向到 fumo.ear(现在是 fumo.war)。
出于某种原因,进入页面后,我的 EJB 中总是出现空值。当我第一次输入 JSP 并尝试再次调用该页面时,它总是很烦人。我的解决方案是:
@WebServlet(urlPatterns = "windows/wUF.do", loadOnStartup = 1)
public class WUFAction extends HttpServlet {
private WUFFacadeRemote engine;
public void doGet(HttpServletRequest req, HttpServletResponse resp) {
doPost(req, resp);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) {
if(engine == null) {
InitialContext ic;
try {
ic = new InitialContext();
engine = (WUFFacadeRemote) ic.lookup("java:global/fumo/WUFFacade!fumo.wuf.WUFFacadeRemote");
} catch (NamingException e) {
e.printStackTrace();
}
}
//here I always have the context now.
}
}
作为 .war 我的结构现在看起来像这样:
因此 @Inject
和 @EJB
等其他注释现在可以使用了。总是当我从调用 Servlet 或某些操作的 JSP 重定向时,我首先检查上下文是否不为空,否则我查找它。我的 @Stateless
正在工作,@PersistenceContext
和 @Remote
也在工作。
@Stateless
public class WUFFacade implements WUFFacadeRemote {
@Inject
private FUFRules rules;
@EJB
private FUFHome home;
private Col load(ClientData data, InitialContext ic) throws InterfaceException {
try {
// home here is nor null anymore.
Collection res = (Collection) home.findByFilter(loader);
...
} catch (InterfaceException e) {
e.printStackTrace();
}
...
return data;
}
}
所以我要感谢所有在线程中提供帮助的人。这是了解和查看问题或找到解决方法的好方法。正如我所说,我以后仍会尝试 .ear,但作为一个简化的包装,它确实有效。
我正在尝试从 EJB2.x 迁移到 EJB3.x,并且我使用的是 Wildfly 9.0.0。 旧的 EJB2.x 在 JBoss 4.2.2 中工作,这就是它的样子:
public interface WUFFacadeRemote extends EJBObject {
public ClientData getItems(ClientData data);
public ClientData save(ClientData data);
}
public interface WUFFacadeHome extends EJBHome {
public WUFFacadeRemote create();
}
public class WUFFacade {
public ClientData getItems(ClientData data) {
//code here
}
public ClientData save(ClientData data) {
//code here
}
}
public class WUFAction extends HttpServlet implements IAction {
public void doPost(HttpServletRequest request, HttpServletResponse response) {
...
Object objRef = ic.lookup("java:comp/env/wUF");
com.wuf.WUFFacadeHome home = (com.wuf.WUFFacadeHome) PortableRemoteObject.narrow(objRef, com.wuf.WUFFacadeHome.class);
engine = home.create();
//engine gets the reference, and I can use it normally.
...
}
}
我也有 ejb-jar.xml,它正在运行。现在,我想 EJB3.x 和 Wildfly 9.0.0 的解决方案如下:
@WebServlet(urlPatterns = "windows/wUF.do", loadOnStartup = 1)
public class WUFAction extends HttpServlet implements IAction {
@EJB
private WUFFacadeRemote engine;
public void doPost(HttpServletRequest request, HttpServletResponse response) {
//Here I should be able to use my engine.
//Wildfly starts and I call the page, engine is not null at this moment,
//but after I call the page again, it becomes null and remains null.
}
}
@Stateless
@Remote(WUFFacadeRemote.class)
public class WUFFacade extends RootFacade implements WUFFacadeRemote, Serializable {
public WUFFacade() { }
@EJB
FUFHome home;
public ClientData getItems(ClientData data) {
//code here
}
public ClientData save(ClientData data) {
//code here
}
private Col load(ClientData data,InitialContext ic) {
//here i'm calling home.
// but home is always null. It was supposed to have the @EJB reference initialized.
//But instead I get a null pointer...
home.findByFilter(loader);
}
}
@Remote(FUFHome.class)
public interface FUFHome {
FUF create(FUFValue fUFValue);
FUF findByPrimaryKey(FUFPK pk);
Collection findByFilter(FacadeLoader loader);
}
public interface WUFFacadeRemote{
public ClientData getItems(ClientData data);
public ClientData save(ClientData data);
}
我不再有 ejb-jar.xml,部署已成功完成,Wildfly 开始时没有错误。然后我第一次调用有问题的页面时,@EJB 似乎正在工作(调试是 "Proxy for remote EJB StatelessEJBLocator for "bus-facade/WUFFacade”,视图是接口 com.wuf.WUFFacadeRemote,亲和力是 None” ),该值不为空,但对于所有后续调用,我的变量为空并且我得到了 NullPointerException。
我真的不知道我做错了什么(也许我完全迷路了),但对我来说,@EJB 应该像那样正常工作。我错过了什么?谢谢
因为我正在使用 EJB3.x 我现在只是在使用注释,(这似乎没问题)。
JNDI:
部署中名为 FUF 的会话 bean 的 JNDI 绑定
java:global/fumo/bus-entities-fumo/FUF!apyon.components.fumo.fuf.FUF
java:app/bus-entities-fumo/FUF!apyon.components.fumo.fuf.FUF
java:module/FUF!apyon.components.fumo.fuf.FUF
java:global/fumo/bus-entities-fumo/FUF
java:app/bus-entities-fumo/FUF
java:module/FUF
名为 WUFFacade 的会话 bean 的 JNDI 绑定
java:global/fumo/bus-facade-fumo/WUFFacade!apyon.fumo.wuf.WUFFacadeRemote
java:app/bus-facade-fumo/WUFFacade!apyon.fumo.wuf.WUFFacadeRemote
java:module/WUFFacade!apyon.fumo.wuf.WUFFacadeRemote
java:jboss/exported/fumo/bus-facade-fumo/WUFFacade!apyon.fumo.wuf.WUFFacadeRemote
java:global/fumo/bus-facade-fumo/WUFFacade
java:app/bus-facade-fumo/WUFFacade
java:module/WUFFacade
我想我找到了解决问题的可能方法。我仍然会尝试找到另一个,但到目前为止还不错。
更改为 .war 并将我的其他项目保留在 .ears 中后,它正在运行。也许问题是因为我的 main.ear 中有一个 RootController servlet,它是应用程序的起点。上下文从那里开始,然后重定向到 fumo.ear(现在是 fumo.war)。
出于某种原因,进入页面后,我的 EJB 中总是出现空值。当我第一次输入 JSP 并尝试再次调用该页面时,它总是很烦人。我的解决方案是:
@WebServlet(urlPatterns = "windows/wUF.do", loadOnStartup = 1)
public class WUFAction extends HttpServlet {
private WUFFacadeRemote engine;
public void doGet(HttpServletRequest req, HttpServletResponse resp) {
doPost(req, resp);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) {
if(engine == null) {
InitialContext ic;
try {
ic = new InitialContext();
engine = (WUFFacadeRemote) ic.lookup("java:global/fumo/WUFFacade!fumo.wuf.WUFFacadeRemote");
} catch (NamingException e) {
e.printStackTrace();
}
}
//here I always have the context now.
}
}
作为 .war 我的结构现在看起来像这样:
因此 @Inject
和 @EJB
等其他注释现在可以使用了。总是当我从调用 Servlet 或某些操作的 JSP 重定向时,我首先检查上下文是否不为空,否则我查找它。我的 @Stateless
正在工作,@PersistenceContext
和 @Remote
也在工作。
@Stateless
public class WUFFacade implements WUFFacadeRemote {
@Inject
private FUFRules rules;
@EJB
private FUFHome home;
private Col load(ClientData data, InitialContext ic) throws InterfaceException {
try {
// home here is nor null anymore.
Collection res = (Collection) home.findByFilter(loader);
...
} catch (InterfaceException e) {
e.printStackTrace();
}
...
return data;
}
}
所以我要感谢所有在线程中提供帮助的人。这是了解和查看问题或找到解决方法的好方法。正如我所说,我以后仍会尝试 .ear,但作为一个简化的包装,它确实有效。