@Inject in @PushEndpoint

UI Components for JSF
Post Reply
krazun
Posts: 17
Joined: 27 Nov 2011, 14:15

15 Jun 2014, 21:54

Hi all,

is it possible to use cdi @Inject in a @PushEndpoint class?

i dont get it working.

kind regards,
krazun

smithh032772
Posts: 6144
Joined: 10 Sep 2011, 21:10

16 Jun 2014, 01:08

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

krazun
Posts: 17
Joined: 27 Nov 2011, 14:15

16 Jun 2014, 08:16

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

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;
    }

}
kind regards,
krazun

smithh032772
Posts: 6144
Joined: 10 Sep 2011, 21:10

16 Jun 2014, 11:49

replace @Singleton

Code: Select all

@Named
@Singleton
public class ChatUsers implements Serializable {
with CDI @ApplicationScoped

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

krazun
Posts: 17
Joined: 27 Nov 2011, 14:15

16 Jun 2014, 15:19

That was it! Now it works, thank you so much!

kind regards,
krazun

zimounof
Posts: 3
Joined: 01 Dec 2014, 16:28

04 Jun 2015, 16:44

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:

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>
Kind regards,
Zim
PrimeFaces 5.1 | Tomcat 7.0.57 | Mojarra 2.2.9

Post Reply

Return to “PrimeFaces”

  • Information
  • Who is online

    Users browsing this forum: Google [Bot] and 29 guests