1

I am developing a Web App with following :

  1. Glassfish v3.1.2
  2. Eclipse Juno SR2
  3. JPA EclipseLink2.0
  4. JSF 2.0

I have different set of pages for the normal user and for admin users. While trying to setup a page filter during login i am getting this error in my login bean : javax.faces.FacesException: #{loginBean.login}: java.lang.NullPointerException

My whole login code works without this part

if (uGDB.validateGroup(username, adminGroup)) {
                return "home.jsf?faces-redirect=true&includeViewParams=true";
            }
            return "normalHome.jsf?faces-redirect=true&includeViewParams=true"

;

What I am trying to do here is to get the Group Id of the user who is logging in and check if it is admin or not. And accordingly I want to direct the user to the corresponding page. This is because i have different set of pages for admin users and normal users. I don't want to use the Glassfish Realms because the end user doesn't require it.

Can someone please help me identify where I am going wrong in this. (Please excuse me for stupid mistakes I am just starting with such an development). Thanks a lot in advance!

Below is the code for my loginBean

   package beans;

import java.io.Serializable;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import ejb.UserDaoBean;
import ejb.UserGroupDaoBean;

import model.User;

@ManagedBean(name = "loginBean")
@RequestScoped
public class LoginBean implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @EJB
    private UserDaoBean uDB;
    private UserGroupDaoBean uGDB;
    private User userId;

    private int adminGroup = 1;

    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String login() {
        FacesContext context = FacesContext.getCurrentInstance();

        if (uDB.validateUser(username)) {
            userId = uDB.findUser(username);

            context.getExternalContext().getSessionMap().put("userId", userId);
            if (uGDB.validateGroup(username, adminGroup)) {
                return "home.jsf?faces-redirect=true&includeViewParams=true";
            }
            return "normalHome.jsf?faces-redirect=true&includeViewParams=true";

        } else {
            FacesMessage message = new FacesMessage();
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            message.setSummary("Username doesn't exists! OR User is trying to login from someone else's account");
            context.addMessage("", message);
            return null;
        }
    }

    public String logout() {
        FacesContext.getCurrentInstance().getExternalContext()
                .invalidateSession();
        return "logout.jsf?faces-redirect=true";
    }

}

Here is the complete error stack from Glassfish log

WARNING: #{loginBean.login}: java.lang.NullPointerException
javax.faces.FacesException: #{loginBean.login}: java.lang.NullPointerException
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    at java.lang.Thread.run(Thread.java:722)
Caused by: javax.faces.el.EvaluationException: java.lang.NullPointerException
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    ... 31 more
Caused by: java.lang.NullPointerException
    at beans.LoginBean.login(LoginBean.java:49)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.sun.el.parser.AstValue.invoke(AstValue.java:254)
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:302)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
    ... 32 more

Here is my controller class

package ejb;

import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import javax.persistence.PersistenceContext;

import model.Group;
import model.User;
import model.UserGroup;

@Stateful
@LocalBean
public class UserGroupDaoBean {
    @PersistenceContext(unitName = "myPU")
    private EntityManager entityManager;

    public UserGroupDaoBean() {

    }

    public UserGroup createNewUserGroup(int groupId, String username) {

        UserGroup newUserGrp = new UserGroup();

        User myUsr;
        myUsr = entityManager.find(User.class, username);
        newUserGrp.setUser(myUsr);

        Group myGrp;
        myGrp = entityManager.find(Group.class, groupId);
        newUserGrp.setGroup(myGrp);

        saveNewUsrGrp(newUserGrp);
        return newUserGrp;
    }

    private void saveNewUsrGrp(UserGroup usrGrp) {
        entityManager.persist(usrGrp);
        entityManager.flush();
    }

    public boolean checkUsertoGroup(String username, int groupId) {

        Group chkGrp;
        chkGrp = entityManager.find(Group.class, groupId);

        User chkUsr;
        chkUsr = entityManager.find(User.class, username);

        if (chkGrp != null) {

            if (chkUsr != null) {

                try {
                    entityManager.createNamedQuery("findGroupsbyUser")
                            .setParameter("username", chkUsr)
                            .setParameter("groupId", chkGrp).getSingleResult();
                    System.out.println("UserGroup already exists");
                    return false;
                } catch (NoResultException e) {
                    return true;
                }

            }
            System.out.println("User doesn't exist");
            return false;
        }
        System.out.println("Group doesn't exist");

        return false;

    }

    public void deleteUserGroup(UserGroup userGroup) {
        userGroup = entityManager.merge(userGroup);
        entityManager.remove(userGroup);
    }

    public UserGroup update(UserGroup myUserGroup) {
        return entityManager.merge(myUserGroup);
    }

    @SuppressWarnings("unchecked")
    public List<UserGroup> getAllUserGroups() {

        try {
            Query query = entityManager.createNamedQuery("findAllUserGroup");
            List<UserGroup> result = (List<UserGroup>) query.getResultList();
            return result;

        } catch (NoResultException e) {
            System.out.println("No Result found");
            return null;
        }
    }

    public boolean validateGroup(String username, int groupId) {

        try {
            UserGroup myGroupId = (UserGroup) entityManager
                    .createNamedQuery("findGroup")
                    .setParameter("username", username)
                    .setParameter("groupId", groupId).getSingleResult();

            if (myGroupId != null) {
                System.out.println("This user is admin!!!");
                return true;
            }

        } catch (NoResultException e) {
            return false;
        }

        System.out.println("This user is not admin");
        return false;
    }
}

Below is my entity UserGroup

package model;

import java.io.Serializable;
import javax.persistence.*;


/**
 * The persistent class for the UserGroup database table.
 * 
 */
@NamedQueries({

    @NamedQuery(name = "findGroupsbyUser", query = "Select ug.group from UserGroup ug where ug.user=:username AND ug.group=:groupId"),

    @NamedQuery(name = "findAllUserGroup", query="Select ug from UserGroup ug"),

    @NamedQuery(name = "findAdminGroupId", query = "Select ug from UserGroup ug where ug.user=:username AND ug.group=:groupId"),


})
@Entity
@Table(name="usergroup")
public class UserGroup implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="RowId" )
    private int rowId;

    //bi-directional many-to-one association to Group
    @ManyToOne
    @JoinColumn(name="groupId")
    private Group group;

    //bi-directional many-to-one association to User
    @ManyToOne
    @JoinColumn(name="username")
    private User user;

    public UserGroup() {
    }

    public int getRowId() {
        return this.rowId;
    }

    public void setRowId(int rowId) {
        this.rowId = rowId;
    }

    public Group getGroup() {
        return this.group;
    }

    public void setGroup(Group group) {
        this.group = group;
    }

    public User getUser() {
        return this.user;
    }

    public void setUser(User user) {
        this.user = user;
    }

}

1 Answer 1

1

Read the stack trace: the NPE is thrown at line 49 of LoginBean.java.

With high probability, uGBD is null, because the EJB annotation is missing. You need to use the @EJB annotation in front of each of the EJBs you are injecting:

@EJB
private UserDaoBean uDB;
@EJB
private UserGroupDaoBean uGDB;
...
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.