2013-05-08 58 views
1

我在尝试将托管bean作为param传递给facelet模板时遇到了很多麻烦。 我想在facelet模板中创建一个变量,并通过ui:param传递它的值,但我经常将“Target Unreachable,identifier'bean'解析为null”错误。 我已经tryed来设置它像:如何将托管bean作为param传递给facelet模板

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

并再次将不起作用。

任何人都可以帮助我吗?

下面是代码:

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"; 
    } 

} 

最后,错误:

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) 

编辑:

我创建一个使用该maven的命令我的项目:

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

回答

0

我从文件中读出什么@Model与RequestScoped相当于@ManagedBean。

所以,如果我尝试修复一样,我可以这样做:

UI:PARAM

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

crud_template.xhtml

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

尝试这一点,这应该工作。

编辑:

我曾尝试复制相同,并能够做得出来。

我在这里发布示例代码供您参考。

还想分享一件事: 如果bean不在xhtml中注入一次,那么您将无法从中获取该引用。

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> 

样品测试页:

<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> 

后端bean类:(与原型不工作)

@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(); 
    } 
} 

修订bean类

@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; 
} 
} 

我还在请求范围中显示了所有可用的变量,这将有助于确定被查找的密钥是否实际可用。

更新 这是我目前为止的观察结果。如果尝试连线@Named,@Model(它不适用于UI,意味着无法在xhtmls中解析)。

CDI更喜欢将注入服务注入控制器或ManagedBean。

例如样品展示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 公共类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; 
} 
} 
+0

那离开我后续的错误:'的ActionListener = “#{requestScope [豆] .save}” :目标无法访问,'familyBean'返回空' – 2013-05-08 23:32:50

+0

我已经更新了一个示例代码看看那个。 – 2013-05-09 05:10:15

+0

我试着执行你传递给我的确切代码,但它又给了我同样的错误:'/WEB-INF/templates/testTemplate.xhtml @ 26,54 listener =“#{requestScope [beantt] .convertNameToUpperCase2}”: Target Unreachable,'helloWorld'returned null:javax.el.PropertyNotFoundException:/WEB-INF/templates/testTemplate.xhtml @ 26,54 listener =“#{requestScope [beantt] .convertNameToUpperCase2}”:目标无法访问,'helloWorld'返回null',那么代码如何在那里运行得很漂亮,这里不要......可能pom.xml导入的是你的不同的依赖关系吗? – 2013-05-10 00:42:47

1

我尝试了所有上述建议,但没有运气。 终于为我工作的唯一事情是在调用方法时使用括号'()'。我想该属性没有发现异常应该是一个线索,它混淆了财产与方法。我认为这是facelets的一个bug,因为它与传统的JSF actionListener和动作方法调用不一致。

上面的例子应该一起工作:

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

其中

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

相关问题