I'm creating a chat room using JSF ,I am using Eclipse and Tomcat 7 to deploy and I have a java.lang.NullPointerException
this is my managed bean:
package Service;
import java.io.Serializable;
import java.util.Collections;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import org.primefaces.context.RequestContext;
import chat.Message;
import chat.MessageManagerLocal;
@ManagedBean
@ViewScoped
public class MessageBean implements Serializable {
@EJB
MessageManagerLocal mm;
private final List messages;
private Date lastUpdate;
private Message message;
/**
* Creates a new instance of MessageBean
*/
public MessageBean() {
messages = Collections.synchronizedList(new LinkedList());
lastUpdate = new Date(0);
message = new Message();
}
public Date getLastUpdate() {
return lastUpdate;
}
public void setLastUpdate(Date lastUpdate) {
this.lastUpdate = lastUpdate;
}
public Message getMessage() {
return message;
}
public void setMessage(Message message) {
this.message = message;
}
public void sendMessage(ActionEvent evt) {
mm.sendMessage(message);
}
public void firstUnreadMessage(ActionEvent evt) {
RequestContext ctx = RequestContext.getCurrentInstance();
Message m =new Message();
if(m!=null)
{
m = mm.getFirstAfter(lastUpdate);
ctx.addCallbackParam("ok", m!=null);
lastUpdate = m.getDateSent();
ctx.addCallbackParam("user", m.getUser());
ctx.addCallbackParam("dateSent", m.getDateSent().toString());
ctx.addCallbackParam("text", m.getMessage());
}
}
}
this is the MessageManager class
package chat;
import java.util.Collections;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import chat.Message;
@Singleton
@Startup
public class MessageManager implements MessageManagerLocal {
private final List<Message> messages =
Collections.synchronizedList(new LinkedList());;
@Override
public void sendMessage(Message msg) {
messages.add(msg);
msg.setDateSent(new Date());
}
@Override
public Message getFirstAfter(Date after) {
if(messages.isEmpty())
return null;
if(after == null)
return messages.get(0);
for(Message m : messages) {
if(m.getDateSent().after(after))
return m;
}
return null;
}
}
This this the exception:
javax.faces.event.AbortProcessingException: /chats.xhtml @21,79 actionListener="#{messageBean.firstUnreadMessage}": java.lang.NullPointerException
and here my chat.xhtml page :
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
>
<h:head>
<title>Chat test!</title>
</h:head>
<h:body>
<h:form prependId="false">
<h:panelGrid columns="2">
Name: <p:inputText value="#{messageBean.message.user}"/>
Text: <p:inputText value="#{messageBean.message.message}"/>
<p:commandButton type="reset" value="Clear"/>
<p:commandButton value="Send!" actionListener="#{messageBean.sendMessage}"/>
</h:panelGrid>
<p:remoteCommand name="nextMessage" actionListener="#{messageBean.firstUnreadMessage}"
oncomplete="updateMessages(xhr, status, args);"/>
</h:form>
<hr/>
<h3>Live chat</h3>
<div id="chat"></div>
<script type="text/javascript">
setInterval("nextMessage()", 200); //update the chart every 200 ms
function updateMessages(xhr, status, args) {
if(!args.ok) return;
$('#chat').append('<div class="msg">[' +args.dateSent+ '] <strong>'+args.user+'</strong>: '+args.text+'</div>');
}
</script>
</h:body>
</html>
I modified my code and did this : Message m =new Message(); but nothing changes