Why does @PostConstruct callback fire every time even though bean is @ViewScoped? JSF

Interesting, when you’re using component binding on a view scoped bean, the view scope breaks.

I am not sure if that is a bug in JSF2, I would have to read the entire JSF2 specification first. As far now your best bet is to drop the component binding for now and pass the selected item via new EL 2.2 method argument syntax:

<h:dataTable var="item" value="#{testBean.stringCollection}">
        <h:outputText value="#{item}"/>
        <h:commandButton value="Click" action="#{testBean.action(item)}"/>

See also:

  • How can I pass selected row to commandLink inside dataTable?
  • Invoke direct methods or methods with arguments / variables / parameters in EL
  • Benefits and pitfalls of @ViewScoped

Update (Dec 2012): this is indeed a bug in JSF2. It’s a chicken-egg issue. The view scoped beans are stored in the JSF view state. So the view scoped beans are only available after restore view phase. However, the binding attribute runs during restore view phase, while the view scoped beans are not available yet. This causes creation of a brand new view scoped bean instance, which is then later replaced by the real view scoped bean which was stored in the restored JSF view state.

This is reported as JSF issue 1492 and JSF spec isssue 787 which will be fixed for JSF 2.2. Until then, your best bet is to use binding on request scoped beans exclusively, or to look for alternate ways for the particular functional requirement.

Update (Mar 2015): The JSF 2.2 fix was backported to Mojarra 2.1.18. So if you’re still using JSF 2.0/2.1, you’d best upgrade to at least that version. See also a.o. What is component binding in JSF? When it is preferred to be used? and JSTL in JSF2 Facelets… makes sense?

Leave a Comment