EJB 未使用 @EJB 在 Wildfly 9.0.0 中初始化

Posted

技术标签:

【中文标题】EJB 未使用 @EJB 在 Wildfly 9.0.0 中初始化【英文标题】:EJB not initializing in Wildfly 9.0.0 using @EJB 【发布时间】: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,我得到了一个N​​ullPointerException。

我真的不知道我做错了什么(也许我完全迷路了),但对我来说,@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 - 但它可能只适合您。 【参考方案1】:

我想我找到了解决问题的可能方法。我仍然会尝试再找一个,但目前为止还不错。

在更改为 .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,但作为一个简化的包装,它肯定可以工作。

【讨论】:

以上是关于EJB 未使用 @EJB 在 Wildfly 9.0.0 中初始化的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JPA/EJB3 和 WildFly 读取未提交的数据?

WildFly 迁移、ejb 问题(8.1.0.Final 到 9.0.1.Final)

WildFly JNDI 查找部署在 WAR 中的本地 EJB

使用对Wildfly 10的远程EJB调用进行身份验证时出现问题

在 Wildfly 10 上运行 EJB 2.1

Wildfly 远程 EJB 调用