【发布时间】:2019-03-01 10:00:20
【问题描述】:
我正在尝试从 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 似乎正在工作(调试是“用于“bus-facade/WUFFacade”的远程 EJB StatelessEJBLocator 的代理,视图是接口 com.wuf.WUFFacadeRemote,affinity is None”) ,值不为null,但是对于所有后续调用,我的变量为null,我得到了一个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
【问题讨论】:
-
你能添加你的ejb-jar.xml的内容吗?还是您的意思是您不再使用它,而只是使用注释。此外,当您部署应用程序时,您是否会获得诸如“名为 'XXX' 的会话 bean 的 JNDI 绑定”之类的条目,其中 XXX 可能是“WUFFacade”EJB
-
明白!如果您没有默认的无参数构造函数,请在 WUFFacade 中进行一项快速测试 - 您可以尝试放置一个并重新部署,看看是否有帮助?
-
我实际上没有默认的无参数构造函数。照你说的做了,还是报同样的错误。什么都没有改变。
-
刚刚尝试使用超类的构造函数,但仍然得到空值。
-
嗯,只是为了测试,作为健全性检查 - 也许尝试只添加一个空的 ejb-jar.xml 并确保为 ejb-3 指定正确的版本。我将其添加为仅作为示例的答案 - 如果它不起作用,可以将其删除。抱歉 - 我一直在与与您类似的问题作斗争,所以尝试我通常的检查 ;-) 另外需要注意的是,下面的架构是 EJB 3.2 - 但它可能只适合您。
标签: jboss ejb ejb-3.0 ejb-3.1 wildfly-9