[英]How to pass a managed bean as param at a facelet template
我在嘗試將托管bean作為facelet模板的參數傳遞時遇到很多麻煩。 我正在嘗試在facelet模板上創建一個變量,並將其值通過ui:param傳遞,但是我一直在出現“ Target Unreachable,標識符'bean'解析為null”的錯誤。 我已經嘗試將其設置為:
<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
我嘗試了以上所有建議,但沒有運氣。 最后對我有用的唯一方法是在調用方法時使用括號'()'。 我猜該屬性未找到異常應該是它混淆了屬性和方法的線索。 我認為這是faceface的錯誤,因為它與傳統的JSF actionListener和操作方法調用不一致。
上面的示例適用於:
<p:commandButton value="Save" actionListener="#{bean.save()}" />
哪里
<ui:param name="bean" value="#{familyBean}" />
我從文檔中讀取的內容@Model等同於具有RequestScoped的@ManagedBean。
因此,如果我嘗試解決此問題,則可以執行以下操作:
用戶界面:PARAM
<ui:param name="bean" value="familyBean" />
在crud_template.xhtml中 :
<p:commandButton value="Save" actionListener="#{requestscope[bean].save}" />
試試看,這應該工作。
編輯:
我確實嘗試復制相同的內容,並且能夠解決。
我將示例代碼發布在這里供您參考。
還想分享一件事:如果未在xhtml中一次注入bean,則將無法從中獲取引用。
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();
}
}
更新的豆類
@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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.