0

In my JSF/PrimeFaces mini web project I want to use a drop down list to select Enum items, then add them to a database when I fill in the 'create' form.
I used Netbeans to create an Entity class from a database, and then used to the wizard 'JSF pages from Entity classes', with PrimeFaces as the template. This creates Create / Edit / List / View xhtml pages automatically. At the moment I've got:

Enum class:

    public enum InterestsEnum {
    FOOTBALL,
    SKIING,
    CYCLING,
    MUSIC;

}

Entity class:

    @Entity
public class Person implements Serializable {

    @Column(name="ID")
    @Id
    @NotNull
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long personId;

    @Column(name="FIRSTNAME")
    @Basic(optional=false)
    @NotNull
    @Size(min=1,max=45)
    private String firstName;

    @Column(name="SURNAME")
    @Basic(optional=false)
    @NotNull
    @Size(min=1,max=45)
    private String surname;

    @ElementCollection(fetch = FetchType.EAGER, targetClass = InterestsEnum.class)
    @JoinTable(name = "Person_INTERESTS", joinColumns = @JoinColumn(name = "PERSON_ID"))
    @Column(name = "INTERESTS", nullable = false)
    @Enumerated(EnumType.STRING)
    Collection<InterestsEnum> interests;

    //Getters and Setters:

Managed Bean:

@ManagedBean
@ApplicationScoped
public class Data {

    public InterestsEnum[] getInterests() {
        return InterestsEnum.values();
    }
}

PrimeFaces Create page extract:

<p:selectOneMenu value="#{person.interests}" >
    <f:selectItems value="#{InterestsEnum}" />
</p:selectOneMenu>

PrimeFaces List page extract:

                        <p:column>
                        <f:facet name="header">
                            <h:outputText value="#{bundle.ListPersonTitle_interests}"/>
                        </f:facet>
                        <h:outputText value="#{item.interests}"/>
                    </p:column>

When I run the project there are no errors until I open 'List', when the following happens:

    Severe:   Error Rendering View[/person/List.xhtml]
javax.faces.FacesException: Cannot find component with expression "interests" referenced from "PersonCreateForm:j_idt34".
    at org.primefaces.expression.SearchExpressionFacade.resolveComponentInternal(SearchExpressionFacade.java:422)
    at org.primefaces.expression.SearchExpressionFacade.resolveComponent(SearchExpressionFacade.java:266)
    at org.primefaces.expression.SearchExpressionFacade.resolveComponent(SearchExpressionFacade.java:228)
    at org.primefaces.component.outputlabel.OutputLabelRenderer.encodeEnd(OutputLabelRenderer.java:47)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:920)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
    at org.primefaces.component.panelgrid.PanelGridRenderer.encodeDynamicBody(PanelGridRenderer.java:89)
    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:920)
    at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312)
    at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:114)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:890)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:890)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:582)
    at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
    at javax.faces.component.UIForm.visitTree(UIForm.java:381)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:403)
    at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:322)
    at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:60)
    at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:1004)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:432)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:134)
    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:659)
    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:416)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
    at java.lang.Thread.run(Thread.java:745)

If I submit the 'create' form I get the following error:

Severe:   javax.faces.component.UpdateModelException: javax.el.PropertyNotFoundException: /person/Create.xhtml @24,71 value="#{Person.interests}": Target Unreachable, identifier 'Person' resolved to null

There is no drop down list to select Enum choices from (see screenshot). Also 'List' shows all the Enum members, not just one.

PrimeFaces List / Create

  • 1
    did you put `` into another one? there should be an '' there – The Bitman Apr 19 '17 at 16:30
  • I had that originally, with the same result. I should have said I've just started using PrimeFaces so I've probably made mistakes. –  Apr 19 '17 at 16:35
  • Take your title, past it in google, look at the stackoverflow hits and find a large upvoted duplicate – Kukeltje Apr 19 '17 at 18:02
  • Possible duplicate of [How to use enum values in f:selectItem(s)](http://stackoverflow.com/questions/8229638/how-to-use-enum-values-in-fselectitems) – Kukeltje Apr 19 '17 at 18:03
  • I've seen it and others and they have been useful but they don't solve my problem! –  Apr 19 '17 at 18:09
  • The first error cannot be caused by anything you posted and could be solved by looking at the 'duplicate' and followingt that working example. The second error is new since you edited your question and has many duplicates in StackOflow... Create an [mcve] for yourself and compare to the duplicate – Kukeltje Apr 19 '17 at 18:44
  • Right, I've had a second look at the 'duplicate' and I now have a simpler project, but I still have a blank drop down list. The problem is the line: ``. It isn't seeing the managed bean class 'Data'. Any ideas? –  Apr 19 '17 at 20:23

1 Answers1

3

After simplifying my project and using one table instead of two and updating my Entity class to:

@Column(name = "INTERESTS")
@Enumerated(EnumType.STRING)
private InterestsEnum interests;

I now have a working project which allows a user to choose Enum members when creating or updating entries.

<h:selectOneMenu value="#{personController.selected.interests}" >
                        <f:selectItems value="#{data.interests}" />
                    </h:selectOneMenu>

This can be seen below:

form enum choice