NULL EJB引用

时间:2015-02-05 09:58:07

标签: java-ee glassfish ejb ejb-3.0 glassfish-4

我使用Eclipse创建了一个包含两个模块的EAP:动态Web应用程序和EJB模块。

EAP的application.xml:

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/application_7.xsd" id="Application_ID" version="7">
  <display-name>JExecuterEAP</display-name>
  <module>
    <ejb>JExecuterEJB.jar</ejb>
  </module>
  <module>
    <web>
      <web-uri>JExecuter.war</web-uri>
      <context-root>JExecuter</context-root>
    </web>
  </module>
</application>  

EJB模块:

package myp;

import javax.ejb.Stateless;

@Stateless
public class ExecutionEngineBean implements IExecutionEngine {

    public ExecutionEngineBean() {

    }

    @Override
    public void test() {
        System.out.println("Test EJB");
    }

}


package myp;

import javax.ejb.Remote;

@Remote
public interface IExecutionEngine {
    public void test();
}

网络应用程序:

import myp.IExecutionEngine;


@ServerEndpoint(value = "/executerendpoint")
public class ExecuterEndpoint {

    @EJB
    IExecutionEngine bean;

    private static final Logger logger =     Logger.getLogger("ExecuterEndpoint");


    @OnOpen
    public void openConnection(Session sesion) {
        logger.log(Level.INFO, "open conection");

        //Here the EJB is NULL

    }

    @OnMessage
    public void onMessage(Session session, String msg) {        
    }

}

我在GlassFish 4.1中进行部署。

2 个答案:

答案 0 :(得分:1)

看起来这个问题与EAR有关。

如果你将相同的代码放入WAR文件中它应该可以工作,但我不确定原因。

它可能与Tyrus有关,它是Glassfish附带的WebSocket实现。我想有些东西是缺少的,这使得它在EAR中起作用。

看看这个问题:

答案建议使用@Inject并查看Tyrus CDI samples & tests,它们包含当前版本的Tyrus可能的示例。有一个名为InjectToStatefulEndpoint.java的测试通过@Inject注入EJB,但看起来测试也在WAR结构中运行。

我还看到了另一个工作示例(源代码可以找到here on GitHub),它使用EAR并使用@LocalBean注释bean,但我不能让它在我自己的工作中运行项目

另见:

答案 1 :(得分:0)

实际上,在尝试了很多东西之后,当我使用@Stateless注释类ExecuterEndpoint时,它工作了。

如果有人有一个很好的解释,我真的很感激。