空 EJB 引用
NULL EJB referece
我有一个使用 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();
}
Web 应用程序:
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 中进行部署。
实际上,在尝试了很多事情之后,当我用@Stateless 注释 class ExecuterEndpoint 时它起作用了。
如果有人有好的解释,我真的很感激。
看来问题与 EAR 有关。
如果将相同的代码放入 WAR 文件中,它应该可以工作,但我不确定原因。
可能与Glassfish自带的WebSocket实现Tyrus有关。我想缺少了让它在 EAR 中工作所必需的东西。
看看这个问题:
- Java EE 7: How-to inject an EJB into a WebSocket ServerEndpoint?
答案建议使用 @Inject
并查看通过 @Inject
注入 EJB 的 Tyrus CDI samples & tests, they contain examples what is possible with the current version of Tyrus. There is test named InjectToStatefulEndpoint.java,但看起来测试也在 运行 中WAR 结构。
我还看到了另一个工作示例(可以找到源代码 here on GitHub),它使用 EAR 并用 @LocalBean
注释 bean,但我无法在我自己的环境中使用它项目。
另请参阅:
我有一个使用 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();
}
Web 应用程序:
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 中进行部署。
实际上,在尝试了很多事情之后,当我用@Stateless 注释 class ExecuterEndpoint 时它起作用了。
如果有人有好的解释,我真的很感激。
看来问题与 EAR 有关。
如果将相同的代码放入 WAR 文件中,它应该可以工作,但我不确定原因。
可能与Glassfish自带的WebSocket实现Tyrus有关。我想缺少了让它在 EAR 中工作所必需的东西。
看看这个问题:
- Java EE 7: How-to inject an EJB into a WebSocket ServerEndpoint?
答案建议使用 @Inject
并查看通过 @Inject
注入 EJB 的 Tyrus CDI samples & tests, they contain examples what is possible with the current version of Tyrus. There is test named InjectToStatefulEndpoint.java,但看起来测试也在 运行 中WAR 结构。
我还看到了另一个工作示例(可以找到源代码 here on GitHub),它使用 EAR 并用 @LocalBean
注释 bean,但我无法在我自己的环境中使用它项目。
另请参阅: