Question

I'm having a lot of trouble trying to pass a managed bean as param at a facelet template. I'm trying to create a variable at a facelet template and pass its value through ui:param, but i'm constantly having the "Target Unreachable, identifier 'bean' resolved to null" error. I already tryed to set it like:

<p:commandButton value="Save" actionListener="#{sessionScope[bean].save}" />

and it again do not work.

Can anyone help me please?

Here is the code:

crud_template.xhtml

<ui:define name="content">

    <h:form>
        <ui:insert name="create_form">
            <!-- Default -->
        </ui:insert>

        <br />
        <br />
        <p:separator />
        <p:commandButton value="Save" actionListener="#{bean.save}" />
        <p:commandButton value="Cancel" actionListener="#{bean.cancel}" />
    </h:form>

</ui:define>

familyPersist.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">

<ui:composition template="/WEB-INF/templates/crud_template.xhtml">

    <ui:param name="bean" value="#{familyBean}" />

    <ui:define name="create_form">
        <h:panelGrid columns="3">
            <h:outputLabel value="Name*:" for="itemName" />
            <p:inputText id="itemName" required="true"
                value="#{familyBean.item.nmFamily}" />
        </h:panelGrid>
    </ui:define>

</ui:composition>
</html>

CrudBean.java

public abstract class CrudBean<T> {

    protected T item;

    private String redirect() {
        return "/pages/protected/" + getEntityName() + "List.jsf";
    }

    public String save() {
        return redirect();
    }

    public String cancel() {
        return redirect();
    }

    public abstract String getEntityName();

    /**
     * @return the item
     */
    public T getItem() {
        return item;
    }

    /**
     * @param item the item to set
     */
    public void setItem(T item) {
        this.item = item;
    }

}

FamilyBean.java

@Model
public class FamilyBean extends CrudBean<Family> {

    public FamilyBean() {
        item = new Family();
    }

    @Override
    public String getEntityName() {
        return "Family";
    }

}

And finally, the error:

22:11:50,178 GRAVE [javax.faces.event] (http-localhost-127.0.0.1-8080-4) javax.el.PropertyNotFoundException: Target Unreachable, identifier 'bean' resolved to null
    at org.apache.el.parser.AstValue.getTarget(AstValue.java:98)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:244)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:39)
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153)
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
    at javax.faces.component.UICommand.broadcast(UICommand.java:300)
    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.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:489)
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50)
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930)
    at java.lang.Thread.run(Thread.java:662)

EDIT:

I create my project using this maven command:

mvn archetype:generate \
    -DarchetypeArtifactId=jboss-javaee6-webapp-archetype \
    -DarchetypeGroupId=org.jboss.spec.archetypes \
    -DarchetypeVersion=7.1.1.CR2
Was it helpful?

Solution 2

What I read from the documents, @Model is equivalent to @ManagedBean with RequestScoped.

So if I try to fix the same, I can do something like:

ui:param

<ui:param name="bean" value="familyBean" />

In crud_template.xhtml:

<p:commandButton value="Save" actionListener="#{requestscope[bean].save}" />

Try this out, this should work.

Edit:

I did try to replicate the same, and was able to work it out.

I am posting the sample code here for your reference.

Also would like to share one thing: If the bean is not inject once inside the xhtml, you will not be able to get the reference out of it.

Template page:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:a4j="http://richfaces.org/a4j">

<h:head></h:head>

<h:form>
    <ui:insert name="create_form">
        <!-- Default -->
    </ui:insert>

    <br />
    <br />

    <h:commandLink id="link" value="Name Converted">
        <f:ajax event="click" listener="#{requestScope[beantt].convertNameToUpperCase2}" execute="dateOfExpense" render="dateOfExpense" />
    </h:commandLink>

</h:form>
</ui:composition>

Sample test page:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:a4j="http://richfaces.org/a4j">

<f:view>
    <h:body>
        <ui:composition template="testTemplate.xhtml">

            <ui:param name="beantt" value="helloWorld" />

            <ui:define name="create_form">
                <h:panelGrid columns="3">
                    <h:outputLabel value="Name*:" for="itemName" />
                    <h:inputText size="20" value="#{helloWorld.name}" id="dateOfExpense"/>
                    <h:outputText value="#{requestScope}" />
                </h:panelGrid>

            </ui:define>

        </ui:composition>

    </h:body>
</f:view>

</ui:composition>

Backend bean class: (Not working with archetype)

 @Named("helloWorld")   //@Model was not available in my project
 public class HelloWorldBean {

    private String name;

    //Getters and Setters

    Logger LOG = LoggerFactory.getLogger(HelloWorldBean.class);

    public void convertNameToUpperCase2(AjaxBehaviorEvent event) {
         LOG.debug("Inside Bean");
         name = name.toUpperCase();
    }
 }

UPDATED BEAN CLASS

 @javax.faces.bean.ManagedBean(name="helloWorld")
 @javax.enterprise.context.RequestScoped
 public class HelloWorldBean {

private String name;

// Getters and Setters

// Logger LOG = LoggerFactory.getLogger(HelloWorldBean.class);

public void convertNameToUpperCase2(AjaxBehaviorEvent event) {
    // LOG.debug("Inside Bean");
    name = name.toUpperCase();
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

I have also displayed all the available variables in request scope, this will help in finding out whether the key being looked for was actually available or not.

Update This is my observation so far. If you try to wire @Named, @Model (it doesn't work well with UI, means cannot resolve in xhtmls).

CDI is more like, injecting services into the controllers or here ManagedBean.

e.g. Sample demonstrating the CDI:

@Named("testCon")
public class TestConsumer {

public String convertNameToUpperCase2(String name) {
    // LOG.debug("Inside Bean");
    return  name.toUpperCase();
}

}

@javax.faces.bean.ManagedBean(name="helloWorld") @javax.enterprise.context.RequestScoped public class HelloWorldBean {

@Inject
@Named("testCon")
private TestConsumer test;

private String name;

// Getters and Setters

// Logger LOG = LoggerFactory.getLogger(HelloWorldBean.class);

public void convertNameToUpperCase2(AjaxBehaviorEvent event) {
    name = test.convertNameToUpperCase2(name);
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
 }

OTHER TIPS

I tried all the above suggestions but no luck. The only thing that finally worked for me is to use Parentheses '()' when invoking a method. I guess that the property not found exception should have been a clue that it confused property with method. I believe this to be a bug with facelets as it is inconsistent with traditional JSF actionListener and action methods invocation.

the example above should work with:

<p:commandButton value="Save" actionListener="#{bean.save()}" />

where

<ui:param name="bean" value="#{familyBean}" />

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top