1

I have two webpages with a bean backing each as well as multiple DAOs running on a Glassfish 4.0 server. The first page is a loginpage - everything works fine here and I can access the injected objects.

On the second page however, every time I try to access one of the injected objects I get a nullpointer-exception.

This is my (working) loginpage:

@ViewScoped
@Named
public class indexController implements Serializable {

private static final Logger log = Logger.getLogger(indexController.class.getName());

private String passwort, growlMsg;
@Inject
Manager manager;
@Inject
PersonalDAO personalDAO;

public indexController() {
}

public String login() {
    System.out.println("------------------LOGIN-----------------------\n"
            + "Werk: " + getWerk() + "\n"
            + "Mandant: " + getMandant() + "\n"
            + "Personalnr:" + getPersnr() + "\n"
            + "Passwort: " + passwort + "\n"
            + "----------------------------------------------");
    if (isValidUser()) {
        manager.setUserVerified(true);
        return "main";
    } else {
        FacesContext ctx = FacesContext.getCurrentInstance();
        ctx.addMessage(null, new FacesMessage("Login failed.", "Please verify your login credentials."));
        return "index";
    }
}

//TODO: Implement hashing and salting
private boolean isValidUser() {
    List<Personal> pers = personalDAO.find(getPersnr());
    if (pers.isEmpty()) {
        return false;
    }
    Personal personal = pers.get(0);
    if (personal.getWerk().getId() != getWerk()) {
        return false;
    }
    if (personal.getMandant().getId() != getMandant()) {
        return false;
    }
    if (!personal.getPasswort().equals(passwort)) {
        return false;
    }
    return true;
}

private boolean isInteger(String n) {
    try {
        Integer.parseInt(n);
    } catch (NumberFormatException ex) {
        return false;
    }
    return true;
}

public int getMandant() {
    return manager.getMandant();
}

public void setMandant(int mandant) {
    manager.setMandant(mandant);
}

public int getWerk() {
    return manager.getWerk();
}

public void setWerk(int werk) {
    manager.setWerk(werk);
}

public int getPersnr() {
    return manager.getPersnr();
}

public void setPersnr(int persnr) {
    manager.setPersnr(persnr);
}

public String getPasswort() {
    return passwort;
}

public void setPasswort(String passwort) {
    this.passwort = passwort;
}

public String getGrowlMsg() {
    return growlMsg;
}

public void setGrowlMsg(String growlMsg) {
    this.growlMsg = growlMsg;
}

}

This is the bean I am having issues with:

@RequestScoped
@Named
public class mainController implements Serializable { 
private List<Abwesenheit> abwesenheit;
private List<Personal> personal;
@Inject
Manager manager;
@Inject
PersonalDAO personalDAO;
@Inject
AbwesenheitDAO abwesenheitDAO;

public mainController() {
    System.out.println("-----MAINCONTROLLER CALLED-----");
    System.out.println(manager.isUserVerified());
    System.out.println("-----------------------------------");
}

public List<Abwesenheit> getAbwesenheit() {
    return abwesenheit;
}

public void setAbwesenheit(List<Abwesenheit> abwesenheit) {
    this.abwesenheit = abwesenheit;
}

public List<Personal> getPersonal() {
    return personal;
}

public String getVerified() {
    return manager.isUserVerified()?"Verified":"Not Verified";
}

}

Manager class:

@SessionScoped
public class Manager implements Serializable {
    //TODO: Use an enum for access-levels instead of just access/no access
    private boolean userVerified = false;
    int werk, mandant, persnr;

    public Manager() {
    }

    public boolean isUserVerified() {
        return userVerified;
    }

    public void setUserVerified(boolean userVerified) {
        this.userVerified = userVerified;
    }

    public int getWerk() {
        return werk;
    }

    public void setWerk(int werk) {
        this.werk = werk;
    }

    public int getMandant() {
        return mandant;
    }

    public void setMandant(int mandant) {
        this.mandant = mandant;
    }

    public int getPersnr() {
        return persnr;
    }

    public void setPersnr(int persnr) {
        this.persnr = persnr;
    }





}

personalDAO class:

@Stateless
public class PersonalDAO implements Serializable {
    @PersistenceContext(unitName="GFOS_AwardPU")
    private EntityManager entityManager;

    public List<Personal> getPersonal() {
        return entityManager.createNamedQuery("Personal.findAll", Personal.class).getResultList();
    }

    public List<Personal> find(String personalNr) {
        Query query = entityManager.createNamedQuery("Personal.findByPersonalnr");
        query.setParameter("personalnr", personalNr);
        return query.getResultList();
    }
    public List<Personal> find(int personalNr) {
        Query query = entityManager.createNamedQuery("Personal.findByPersonalnr");
        query.setParameter("personalnr", personalNr);
        return query.getResultList();
    }

    public List<Personal> find(String personalNr, String name, String vorname, String mandant, String werk) {

        String query = "SELECT * FROM Personal WHERE 1=1";
        if(personalNr != null && !personalNr.isEmpty()) {
            query += " AND Personalnr="+personalNr;
        }
        if(name != null && !name.isEmpty()) {
            query += " AND name='"+name+"'";
        }
        if(vorname != null && !vorname.isEmpty()) {
            query += " AND vorname='"+vorname+"'";
        }
        if(mandant != null && !mandant.isEmpty()) {
            query += " AND mandant="+mandant;
        }
        if(werk != null && !werk.isEmpty()) {
            query += " AND werk="+werk;
        }
        return entityManager.createNativeQuery(query, Personal.class).getResultList();
    }
}

This is the Glassfish server log extract, there are no exceptions prior:

[2016-03-10T19:43:21.303+0100] [glassfish 4.0] [INFO] [] [] [tid: _ThreadID=22 _ThreadName=Thread-3] [timeMillis: 1457635401303] [levelValue: 800] [[
  -----MAINCONTROLLER CALLED-----]]

[2016-03-10T19:43:21.304+0100] [glassfish 4.0] [SEVERE] [] [javax.enterprise.resource.webcontainer.jsf.application] [tid: _ThreadID=22 _ThreadName=http-listener-1(5)] [timeMillis: 1457635401304] [levelValue: 1000] [[
  Error Rendering View[/main.xhtml]
java.lang.NullPointerException
    at controller.mainController.<init>(mainController.java:38)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:79)
    at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:63)
    at org.jboss.weld.injection.producer.AbstractInstantiator.newInstance(AbstractInstantiator.java:29)
    at org.jboss.weld.injection.producer.DefaultInstantiator.newInstance(DefaultInstantiator.java:90)
    at org.jboss.weld.injection.producer.BasicInjectionTarget.produce(BasicInjectionTarget.java:86)
    at org.jboss.weld.injection.producer.BeanInjectionTarget.produce(BeanInjectionTarget.java:172)
    at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:157)
    at org.jboss.weld.context.unbound.DependentContextImpl.get(DependentContextImpl.java:69)
    at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:716)
    at org.jboss.weld.el.AbstractWeldELResolver.lookup(AbstractWeldELResolver.java:133)
    at org.jboss.weld.el.AbstractWeldELResolver.getValue(AbstractWeldELResolver.java:96)
    at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:188)
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    at com.sun.el.parser.AstIdentifier.getValue(AstIdentifier.java:116)
    at com.sun.el.parser.AstValue.getBase(AstValue.java:151)
    at com.sun.el.parser.AstValue.getValue(AstValue.java:200)
    at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:226)
    at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
    at javax.faces.component.UIOutput.getValue(UIOutput.java:174)
    at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205)
    at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:355)
    at com.sun.faces.renderkit.html_basic.LabelRenderer.encodeBegin(LabelRenderer.java:120)
    at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:869)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1854)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:443)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
    at java.lang.Thread.run(Unknown Source)
]]

[2016-03-10T19:43:21.358+0100] [glassfish 4.0] [INFO] [] [] [tid: _ThreadID=22 _ThreadName=Thread-3] [timeMillis: 1457635401358] [levelValue: 800] [[
  -----MAINCONTROLLER CALLED-----]]

[2016-03-10T19:43:21.375+0100] [glassfish 4.0] [FATAL] [jsf.context.exception.handler.log] [javax.enterprise.resource.webcontainer.jsf.context] [tid: _ThreadID=22 _ThreadName=http-listener-1(5)] [timeMillis: 1457635401375] [levelValue: 1100] [[
  JSF1073: java.lang.NullPointerException erfasst w?hrend Verarbeitung von RENDER_RESPONSE 6 : UIComponent-ClientId=, Message=null]]

[2016-03-10T19:43:21.376+0100] [glassfish 4.0] [FATAL] [] [javax.enterprise.resource.webcontainer.jsf.context] [tid: _ThreadID=22 _ThreadName=http-listener-1(5)] [timeMillis: 1457635401376] [levelValue: 1100] [[

java.lang.NullPointerException
    at controller.mainController.<init>(mainController.java:38)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:79)
    at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:63)
    at org.jboss.weld.injection.producer.AbstractInstantiator.newInstance(AbstractInstantiator.java:29)
    at org.jboss.weld.injection.producer.DefaultInstantiator.newInstance(DefaultInstantiator.java:90)
    at org.jboss.weld.injection.producer.BasicInjectionTarget.produce(BasicInjectionTarget.java:86)
    at org.jboss.weld.injection.producer.BeanInjectionTarget.produce(BeanInjectionTarget.java:172)
    at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:157)
    at org.jboss.weld.context.unbound.DependentContextImpl.get(DependentContextImpl.java:69)
    at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:716)
    at org.jboss.weld.el.AbstractWeldELResolver.lookup(AbstractWeldELResolver.java:133)
    at org.jboss.weld.el.AbstractWeldELResolver.getValue(AbstractWeldELResolver.java:96)
    at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:188)
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    at com.sun.el.parser.AstIdentifier.getValue(AstIdentifier.java:116)
    at com.sun.el.parser.AstValue.getBase(AstValue.java:151)
    at com.sun.el.parser.AstValue.getValue(AstValue.java:200)
    at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:226)
    at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
    at javax.faces.component.UIOutput.getValue(UIOutput.java:174)
    at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205)
    at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:355)
    at com.sun.faces.renderkit.html_basic.LabelRenderer.encodeBegin(LabelRenderer.java:120)
    at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:869)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1854)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:443)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
    at java.lang.Thread.run(Unknown Source)
]]

Why doesn't it work in the mainController class? I've tried changing the scopes of both classes but that did not help. Netbeans does not show any errors. I have also tried starting Glassfish trough both Netbeans or manual. The last thing I tried is changing the imports from

import javax.faces.bean.RequestScoped

(and the SessionScoped of the manager-class) to

import javax.enterprise.context.RequestScoped

yet none of it fixed my problem.

Kukeltje
  • 12,223
  • 4
  • 24
  • 47
flwd
  • 548
  • 3
  • 12
  • Your 'manager' class is not a managed bean. It misses `@Named`. Did you not notice this? – Kukeltje Mar 10 '16 at 19:17
  • What is the purpose of `WHERE 1=1` in the query always returning true? And use the JPA criteria API for dynamic queries which is sole purpose of that API in place of nasty string concatenation in the native query being difficult to read / understand / maintain, hard to trace / debug. – Tiny Mar 10 '16 at 19:17
  • @Kukeltje : `@Named` is not required, if the bean is not to be accessed in EL like `#{manager}`. – Tiny Mar 10 '16 at 19:24
  • Please follow the basic Java naming conventions here `mainController`, `indexController`. These are class names which should start with a capital letter. – Tiny Mar 10 '16 at 19:26
  • @Kukeltje I did notice, but it works fine in the first class. Adding it does not fix it either, I still get the exception. – flwd Mar 10 '16 at 19:28
  • @Tiny: The WHERE 1=1 is there so I don't need to check each condition for if it's the first. Like this I can just add it if it's set. Also, yeah I'll change the class names. – flwd Mar 10 '16 at 19:30
  • @Kukeltje `@Named` is not needed as long as class has explicit CDI scope (`@SessionScoped` in this case). – Geinmachi Mar 10 '16 at 19:38
  • @Geinmachi: I keep forgetting that new CDI thing. Old habits die hard. And shame on me. I did inspect this constructor thing AND noticed it, but did not mention it since I thought injecting would not work at all due to the missing (not) `@Named` – Kukeltje Mar 10 '16 at 19:52

1 Answers1

3

Instead of constructor

public mainController() {
    System.out.println("-----MAINCONTROLLER CALLED-----");
    System.out.println(manager.isUserVerified());
    System.out.println("-----------------------------------");
}

use method with annotation @PostConstruct.

@PostConstruct
private void init() {
    System.out.println("-----MAINCONTROLLER INITIALIZED-----");
    System.out.println(manager.isUserVerified());
    System.out.println("-----------------------------------");
}

Dependencies are not yet injected in constructor, they can be accessed after object is created.

Geinmachi
  • 1,251
  • 1
  • 8
  • 20