The Nightmare
The Nightmare

Reputation: 701

JSF Converter oneSelectMenu null pointer exception

I have a oneSelectMenu:

<p:selectOneMenu id="specialization" value="#{visitMB.specialization}" effect="fade" 
    style="width:200px" converter="#{specializationConverter}">
        <f:selectItems value="#{visitMB.allSpecialization}" var="specialization" 
            itemValue="#{specialization}" itemLabel="#{specialization.name}"/>
</p:selectOneMenu>

VisitMB:

@ManagedBean
@ViewScoped
public class VisitMB implements Serializable {

    @EJB
    private VisitDaoLocal visitDao;
    @EJB
    private UserDaoLocal userDao;
    @EJB
    private SpecializationDaoLocal specializationDao;
    private Specialization specialization;

    public VisitMB() {
    }

    public Specialization getSpecialization() {
        if (specialization == null) {
            specialization = new Specialization();
        }
        return specialization;
    }

    public void setSpecialization(Specialization specialization) {
        this.specialization = specialization;
    }

    public List<Specialization> getAllSpecialization() {
        return specializationDao.findAllSpecialization();
    }

Converter:

@ManagedBean
@RequestScoped
public class SpecializationConverter implements Converter {

    @EJB
    private SpecializationDaoLocal specializationDao;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        Integer id = Integer.parseInt(value);
        return specializationDao.find(id);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return ((Specialization) value).getId().toString();
    }
}

I have a errors:

java.lang.NullPointerException
    at pl.ePrzychodnia.converter.SpecializationConverter.getAsString(SpecializationConverter.java:46)
    at org.primefaces.util.ComponentUtils.getValueToRender(ComponentUtils.java:71)
    at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeLabel(SelectOneMenuRenderer.java:137)
    at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeMarkup(SelectOneMenuRenderer.java:92)
    at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeEnd(SelectOneMenuRenderer.java:65)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1764)
    at org.primefaces.component.panelgrid.PanelGridRenderer.encodeDynamicBody(PanelGridRenderer.java:92)
    at org.primefaces.component.panelgrid.PanelGridRenderer.encodeBody(PanelGridRenderer.java:60)
    at org.primefaces.component.panelgrid.PanelGridRenderer.encodeEnd(PanelGridRenderer.java:49)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
    at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:63)
    at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:47)
    at org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:202)
    at org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:119)
    at org.primefaces.component.panel.PanelRenderer.encodeEnd(PanelRenderer.java:56)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1764)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
    at pl.ePrzychodnia.filter.FilterLogin.doFilter(FilterLogin.java:49)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
    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)

But i don't now why i have a errors. Converter works well, because when I use this:

changed

<p:selectOneMenu id="specialization" value="#{visitMB.specialization}" 
    effect="fade" style="width:200px" converter="#{specializationConverter}">

to

<p:selectOneMenu id="specialization" value="#{userMB.user.specialization}" 
    effect="fade" style="width:200px" converter="#{specializationConverter}">

all work good. Why? I must set specialization in visitMB.

Upvotes: 0

Views: 2172

Answers (1)

BalusC
BalusC

Reputation: 1109715

It's because the supplied value #{visitMB.specialization} is null and you're never checking on that in your converter. Your converter is outrightly calling getId() on the supplied value without checking beforehand if it's not null.

Add a null-check in the converter:

return (value != null) ? ((Specialization) value).getId().toString() : null;

Note that this approach would still fail if there's a Specialization instance with a null ID (which would not occur in this specific case). But you should now be able to fix that on your own whenever that occurs.

Also note that this problem has fundamentally nothing to do with JSF. It's just basic Java. You got an exception of java.lang package.

Upvotes: 3

Related Questions