I'm developing chat app using OmniFaces version 2.7 o:socket and it works like a charm when I deploy it to WildFly 13.0.0 Final but it won't deploy on WebLogic Server Version: 12.2.1.3.0.
Here is the stack trace I'm getting:
Caused By: java.lang.NullPointerException
at org.omnifaces.cdi.push.Socket.registerEndpointIfNecessary(Socket.java:976)
at org.omnifaces.ApplicationListener.contextInitialized(ApplicationListener.java:86)
at weblogic.servlet.internal.EventsManager$FireContextListenerAction.run(EventsManager.java:705)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:328)
at weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:197)
at weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(WlsSecurityProvider.java:203)
at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:71)
at weblogic.servlet.internal.EventsManager.executeContextListener(EventsManager.java:251)
at weblogic.servlet.internal.EventsManager.notifyContextCreatedEvent(EventsManager.java:204)
at weblogic.servlet.internal.EventsManager.notifyContextCreatedEvent(EventsManager.java:189)
at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:1921)
at weblogic.servlet.internal.WebAppServletContext.start(WebAppServletContext.java:3106)
at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1843)
at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:884)
at weblogic.application.internal.ExtensibleModuleWrapper$StartStateChange.next(ExtensibleModuleWrapper.java:360)
at weblogic.application.internal.ExtensibleModuleWrapper$StartStateChange.next(ExtensibleModuleWrapper.java:356)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:45)
at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:138)
at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124)
I have added socket endpoint enabled to my web.xml
<context-param>
<param-name>org.omnifaces.SOCKET_ENDPOINT_ENABLED</param-name>
<param-value>true</param-value>
</context-param>
I have created minmal example that reproduces the code. Here is the source:
Here is my bean that holds all the messages:
@Data
@Named
@ApplicationScoped
public class ChatContentBean {
private List<ChatMessage> chatMessages;
@Inject
@Push
private PushContext someChannel;
@PostConstruct
public void init() {
chatMessages = new ArrayList<>();
}
public void clearHistory() {
chatMessages = new ArrayList<>();
}
public void onPageView(@Observes ChatMessage pageView) {
chatMessages.add(pageView);
someChannel.send(pageView);
}
}
My backing bean:
@Log4j
@Data
@Named
@ViewScoped
@Interceptors({ExceptionInterceptor.class})
public class ChatViewBean extends SomeOtherContentPage {
private String chatMessage;
@Inject
@Push
private PushContext someChannel;
@Inject
private BeanManager beanManager;
@Inject
private ChatContentBean chatContentBean;
@Override
@PostConstruct
public void init() {
super.init();
}
public void clearHistory() {
chatContentBean.clearHistory();
}
public void sendMessage() {
ChatMessage cm = new ChatMessage(chatMessage, AuthContext.getUser().displayName());
someChannel.send(cm);
beanManager.fireEvent(cm);
chatMessage = null;
}
}
And part of my xhtml:
<o:socket channel="someChannel" onmessage="updateStatsRc"/>
<h:panelGroup id="chat">
<ui:repeat value="#{chatContentBean.chatMessages}" var="chatElement">
<p:panelGrid columns="1">
<h:outputText value="#{chatElement.user} #{chatElement.timestamp} #{chatElement.message}"/>
</p:panelGrid>
</ui:repeat>
</h:panelGroup>
<p:remoteCommand name="updateStatsRc" update="chat"/>
<h:inputText id="chat_input_text" value="#{chatViewBean.chatMessage}"/>
<p:commandButton value="Send" update="chat_input_text" action="#{chatViewBean.sendMessage()}"/>
<p:commandButton value="Clear chat history" action="#{chatViewBean.clearHistory()}" update="chat"/>
</h:form>
And my ChatMessage class:
@Data
public class ChatMessage {
private String message;
private String timestamp;
private String user;
public ChatMessage(String message, String user) {
this.message = message;
timestamp = LocalDateTime.now().toString();
this.user = user;
}
}
I allso tryed to add org.omnifaces.ApplicationListener to web.xml but it doesnt change anything.
Any ideas why it won't deploy to weblogic but it works on wildfly?