Hi all,
is it possible to use cdi @Inject in a @PushEndpoint class?
i dont get it working.
kind regards,
krazun
@Inject in @PushEndpoint
-
- Posts: 6144
- Joined: 10 Sep 2011, 21:10
share 'all' of your Primefaces Push code.
Howard
PrimeFaces 6.0, Extensions 6.0.0, Push (Atmosphere 2.4.0)
TomEE+ 1.7.4 (Tomcat 7.0.68), MyFaces Core 2.2.9, JDK8
JUEL 2.2.7 | OmniFaces | EclipseLink-JPA/Derby | Chrome
Java EE 6 Tutorial|NetBeans|Google|Stackoverflow|PrimeFaces|Apache
PrimeFaces 6.0, Extensions 6.0.0, Push (Atmosphere 2.4.0)
TomEE+ 1.7.4 (Tomcat 7.0.68), MyFaces Core 2.2.9, JDK8
JUEL 2.2.7 | OmniFaces | EclipseLink-JPA/Derby | Chrome
Java EE 6 Tutorial|NetBeans|Google|Stackoverflow|PrimeFaces|Apache
first of all i use primefaces-5.0.jar and atmosphere-runtime-2.1.5.jar
i want to inject the @Named ChatUsers in the @PushEndpoint ChatResource to use it in the @OnClose method
kind regards,
krazun
i want to inject the @Named ChatUsers in the @PushEndpoint ChatResource to use it in the @OnClose method
Code: Select all
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://primefaces.org/ui">
<ui:define name="meta">
<f:metadata>
<f:viewAction action="#{chatView.init()}"/>
</f:metadata>
</ui:define>
<ui:composition template="/templates/mainTemplate.xhtml">
<ui:define name="content">
<h:form id="form">
<p:remoteCommand name="updateList" update="users" process="@this" />
<p:fieldset id="container">
<h:panelGroup rendered="#{chatView.loggedIn}">
<h:panelGrid columns="2" style="width:100%" columnClasses="leftText,leftText">
<p:outputPanel id="public" layout="block" style="width:750px; height:500px; overflow-y: scroll; text-align: left; overflow-wrap: break-word" />
<p:dataList id="users" var="user" value="#{chatUsers.users}" styleClass="usersList">
<f:facet name="header">
Users
</f:facet>
<p:commandButton title="Chat" icon="ui-icon-comment" oncomplete="PF('pChat').show()" update=":form:privateChatContainer">
<f:setPropertyActionListener value="#{user}" target="#{chatView.privateUser}" />
</p:commandButton>
#{user}
</p:dataList>
</h:panelGrid>
<p:separator />
<p:inputText value="#{chatView.globalMessage}" styleClass="messageInput" />
<p:spacer width="5" />
<p:commandButton value="Send" actionListener="#{chatView.sendGlobal()}" oncomplete="$('.messageInput').val('').focus()" />
<p:spacer width="5" />
<p:commandButton value="Disconnect" actionListener="#{chatView.disconnect}" global="false" update="container" />
</h:panelGroup>
</p:fieldset>
<p:dialog widgetVar="pChat" header="Private Chat" modal="true" showEffect="fade" hideEffect="fade">
<h:panelGrid id="privateChatContainer" columns="2" columnClasses="vtop,vtop">
<p:outputLabel for="pChatInput" value="To: #{chatView.privateUser}" />
<p:inputTextarea id="pChatInput" value="#{chatView.privateMessage}" rows="5" cols="30" />
<p:spacer />
<p:commandButton value="Send" actionListener="#{chatView.sendPrivate}" oncomplete="PF('pChat').hide()" />
</h:panelGrid>
</p:dialog>
</h:form>
<p:socket onMessage="handleMessage" channel="/raum" autoConnect="flase" widgetVar='subscriber'/>
<script type="text/javascript">
function handleMessage(message) {
var chatContent = $(PrimeFaces.escapeClientId('form:public')),
text = (message.user) ? message.user + ':' + message.text : message.text;
chatContent.append(text + '<br />');
//keep scroll
chatContent.scrollTop(chatContent.height());
if (message.updateList) {
updateList();
}
}
</script>
</ui:define>
</ui:composition>
</html>
Code: Select all
package de.site.website.view;
import com.ocpsoft.pretty.faces.annotation.URLAction;
import com.ocpsoft.pretty.faces.annotation.URLMapping;
import de.site.website.controller.CustomerController;
import de.site.website.controller.SessionController;
import de.site.website.push.ChatUsers;
import de.site.website.push.Message;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.context.RequestContext;
import org.primefaces.push.EventBus;
import org.primefaces.push.EventBusFactory;
@Named
@SessionScoped
@URLMapping(id = "chat", pattern = "/chat/", viewId = "/chat.xhtml")
public class ChatView implements Serializable {
//private final PushContext pushContext = PushContextFactory.getDefault().getPushContext();
private final EventBus eventBus = EventBusFactory.getDefault().eventBus();
@Inject
private ChatUsers users;
@Inject
SessionController sessionController;
@Inject
CustomerController customerController;
private String privateMessage;
private String globalMessage;
private String username;
private boolean loggedIn;
private String privateUser;
private final static String CHANNEL = "/raum/";
public void init() {
}
public ChatUsers getUsers() {
return users;
}
public void setUsers(ChatUsers users) {
this.users = users;
}
public String getPrivateUser() {
return privateUser;
}
public void setPrivateUser(String privateUser) {
this.privateUser = privateUser;
}
public String getGlobalMessage() {
return globalMessage;
}
public void setGlobalMessage(String globalMessage) {
this.globalMessage = globalMessage;
}
public String getPrivateMessage() {
return privateMessage;
}
public void setPrivateMessage(String privateMessage) {
this.privateMessage = privateMessage;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public boolean isLoggedIn() {
return loggedIn;
}
public void setLoggedIn(boolean loggedIn) {
this.loggedIn = loggedIn;
}
public void sendGlobal() {
eventBus.publish(CHANNEL + "*", username + ": " + globalMessage);
globalMessage = null;
}
public void sendPrivate() {
eventBus.publish(CHANNEL + privateUser, "[PM] " + username + ": " + privateMessage);
privateMessage = null;
}
@URLAction(onPostback = false)
public void login() {
RequestContext requestContext = RequestContext.getCurrentInstance();
String user = customerController.getCustomer(sessionController.getCustomerId()).getUsername();
if (users.contains(user)) {
loggedIn = true;
setUsername(user);
requestContext.execute("PF('subscriber').connect('/" + username + "')");
// FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Username taken", "Try with another username."));
// requestContext.update("growl");
} else {
users.add(user);
setUsername(user);
requestContext.execute("PF('subscriber').connect('/" + username + "')");
loggedIn = true;
}
}
public void disconnect() {
//remove user and update ui
users.remove(username);
RequestContext.getCurrentInstance().update("form:users");
//push leave information
eventBus.publish(CHANNEL + "*", new Message(String.format("%s has left the room", username), true));
//reset state
loggedIn = false;
username = null;
}
}
Code: Select all
package de.site.website.push;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.inject.Named;
import javax.inject.Singleton;
@Named
@Singleton
public class ChatUsers implements Serializable {
private List<String> users;
@PostConstruct
public void init() {
users = new ArrayList<>();
}
public List<String> getUsers() {
return users;
}
public void remove(String user) {
this.users.remove(user);
}
public void add(String user) {
this.users.add(user);
}
public boolean contains(String user) {
return this.users.contains(user);
}
}
Code: Select all
package de.site.website.push;
import javax.inject.Inject;
import org.primefaces.push.EventBus;
import org.primefaces.push.RemoteEndpoint;
import org.primefaces.push.annotation.OnClose;
import org.primefaces.push.annotation.OnMessage;
import org.primefaces.push.annotation.OnOpen;
import org.primefaces.push.annotation.PathParam;
import org.primefaces.push.annotation.PushEndpoint;
import org.primefaces.push.annotation.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@PushEndpoint("/{room}/{user}")
@Singleton
public class ChatResource {
private final Logger logger = LoggerFactory.getLogger(ChatResource.class);
@PathParam("room")
private String room;
@PathParam("user")
private String username;
@Inject
ChatUsers chatUsers;
@OnOpen
public void onOpen(RemoteEndpoint r, EventBus eventBus) {
logger.info("OnOpen {}", r);
eventBus.publish(room + "/*", new Message(String.format("%s has entered the room '%s'", username, room), true));
}
@OnClose
public void onClose(RemoteEndpoint r, EventBus eventBus) {
// is everytime null
System.err.println("chatusers: " + chatUsers);
eventBus.publish(room + "/*", new Message(String.format("%s has left the room", username), true));
}
@OnMessage(decoders = {MessageDecoder.class}, encoders = {MessageEncoder.class})
public Message onMessage(Message message) {
return message;
}
}
krazun
-
- Posts: 6144
- Joined: 10 Sep 2011, 21:10
replace @Singleton
with CDI @ApplicationScoped
Code: Select all
@Named
@Singleton
public class ChatUsers implements Serializable {
Code: Select all
@Named
@ApplicationScoped
public class ChatUsers implements Serializable {
Howard
PrimeFaces 6.0, Extensions 6.0.0, Push (Atmosphere 2.4.0)
TomEE+ 1.7.4 (Tomcat 7.0.68), MyFaces Core 2.2.9, JDK8
JUEL 2.2.7 | OmniFaces | EclipseLink-JPA/Derby | Chrome
Java EE 6 Tutorial|NetBeans|Google|Stackoverflow|PrimeFaces|Apache
PrimeFaces 6.0, Extensions 6.0.0, Push (Atmosphere 2.4.0)
TomEE+ 1.7.4 (Tomcat 7.0.68), MyFaces Core 2.2.9, JDK8
JUEL 2.2.7 | OmniFaces | EclipseLink-JPA/Derby | Chrome
Java EE 6 Tutorial|NetBeans|Google|Stackoverflow|PrimeFaces|Apache
I can't get it working neither, even with a simple project that uses exactly the showcase's Chat code - except that I'm using CDI (1.2) instead of JSF annotations.
Even trying to @Inject javax.servlet.ServletContext in ChatResource (like in the original code) resolves to a null value.
Can anyone who successfully got the @Inject annotation working in @PushEndpoint share some relevant piece of configuration? (eg. pom.xml)
Here are the relevant dependencies in my pom.xml:
Kind regards,
Zim
Even trying to @Inject javax.servlet.ServletContext in ChatResource (like in the original code) resolves to a null value.
Can anyone who successfully got the @Inject annotation working in @PushEndpoint share some relevant piece of configuration? (eg. pom.xml)
Here are the relevant dependencies in my pom.xml:
Code: Select all
<!-- Servlet API -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- JSF -->
<dependency>
<groupId>${jsf.group}</groupId>
<artifactId>${jsf.artifact}-api</artifactId>
<version>${jsf.version}</version>
</dependency>
<dependency>
<groupId>${jsf.group}</groupId>
<artifactId>${jsf.artifact}-impl</artifactId>
<version>${jsf.version}</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>el-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<!-- Primefaces -->
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>5.2</version>
</dependency>
<dependency>
<groupId>org.primefaces.themes</groupId>
<artifactId>all-themes</artifactId>
<version>1.0.10</version>
</dependency>
<!-- Atmosphere -->
<dependency>
<groupId>org.atmosphere</groupId>
<artifactId>atmosphere-runtime</artifactId>
<version>2.3.1</version>
</dependency>
<!-- CDI -->
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>1.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>2.2.12.Final</version>
</dependency>
Zim
PrimeFaces 5.1 | Tomcat 7.0.57 | Mojarra 2.2.9
-
- Information
-
Who is online
Users browsing this forum: Google [Bot] and 29 guests