首先我想说这个问题更多是关于CDI,尤其是CDI Events。容器(在我的情况下,Weblogic 12 无法注入Event
对象)
问题的动机:
我正在尝试将 JMS 与 WebSocket 集成。基本上,我试图从 JMS 消费一条消息,然后引发一个事件,以便服务器端点可以接收 JMS 消息并最终通过 WebSocket 协议将其引发到浏览器。我从这个博客有了在 JMS 和 WebSocket 之间进行集成的想法。 请注意,我没有将 CDI 用于任何其他目的。. 但是当我尝试触发注入事件时,我正面临 NPE。
我的理解是,要使用CDI
我需要定义 a beans.xml
,即使几乎是空的。
我的beans.xml
(我把这个放在我的网络应用程序的目录里面WEB-INF
,我已经粘贴了下面的内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>
我的EventProducer
课程如下所示:
public class EventProducer {
@Inject
@WSJMSMessage
Event<DataChangeEvent> wsDeltaEvent;
boolean raiseEvent = false;
void produceEvent() {
if (raiseEvent) {
DataChangeEvent event = new DataChangeEvent(lastSeqNumberOfChangeLists, messageSelector, dataChangeEntries);
wsDeltaEvent.fire(event); //Raising the NPE because wsDeltaEvent has not been injected.
}
}
}
是这样定义的Event
Qualifier
:
/**
* Identifies WebSocket JMS messages.
*/
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
public @interface WSJMSMessage {
}
事件的消费者是类onJMSMessage
上的方法ServerEndpoint
,相关部分粘贴在下面:
@ServerEndpoint(value = "/{projectName}/{businessViewName}/wsdata",
encoders = {WSJsonEncoder.class},
decoders = {WSJsonDecoder.class})
public class WebSocketActiveDataHandler {
// Other Lifecycle methods omitted for brevity
public void onJMSMessage(@Observes @WSJMSMessage DataChangeEvent dataChangeEvent) {
//Something here
}
}
我在这里想念什么?任何指针?