[英]upload the file with javascript and set into the jsf bean property
[英]JSF 2: property on bean assumed to be written instead of read?
我有以下簡單的視圖main.xhtml
,請求URL將是這樣的:
http://localhost:8080/myproj/main.jsf?pq=2
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich"
template="/templating/layout-2col.xhtml">
<ui:define name="metadata">
<f:metadata>
<f:viewParam name="pq" value="#{pqHome.id}" required="true">
<f:convertNumber integerOnly="#{true}" />
</f:viewParam>
<f:event type="preRenderView" listener="#{pqHome.init}" />
</f:metadata>
</ui:define>
...
<ui:define name="content-right">
<h:form>
<rich:panel>
<f:facet name="header">
Menu
</f:facet>
<rich:tabPanel binding="#{pqHome.tabPanel}">
</rich:tabPanel>
</rich:panel>
</h:form>
</ui:define>
</ui:composition>
我的豆子:
@ManagedBean
@RequestScoped
public class PqHome implements Serializable
{
@Inject
private PqService pqService;
//@ManagedProperty(value="#{param.pq}")
private Integer id;
private Prequalification instance;
@Inject
private PqPartnerListQuery pplq;
private List<Partner> partners;
private UITabPanel tabPanel;
private List<UIComponent> tabs;
//@PostConstruct
public void init()
{
System.out.println("ID is " + id);
instance = pqService.findSingleInstance(id);
partners = pplq.getItemsForPq(id);
System.out.println("Building tab manually...");
// RF way...
FacesContext fc = FacesContext.getCurrentInstance();
Application application = FacesContext.getCurrentInstance().getApplication();
tabPanel = (UITabPanel)application.createComponent(UITabPanel.COMPONENT_TYPE);
tabPanel.setSwitchType(SwitchType.client);
tabs = tabPanel.getChildren();
for ( Partner partner : partners )
{
Company co = partner.getCompany();
String companyName = co.getName();
UITab tab = (UITab)application.createComponent(UITab.COMPONENT_TYPE);
//tab.setTitle(companyName);
tab.setName(companyName);
tab.setId(co.getDndType());
tabs.add(tab);
}
String firstTabName = partners.get(0).getCompany().getName();
System.out.println("First tab name = " + firstTabName);
tabPanel.setActiveItem(firstTabName);
}
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public Prequalification getInstance()
{
return instance;
}
public UITabPanel getTabPanel()
{
return tabPanel;
}
}
在請求上述頁面時,我收到錯誤消息:
An Error Occurred:
/main.xhtml @221,53 binding="#{pqHome.tabPanel}": The class 'de.mycomp.myproj.beans.PqHome' does not have a writable property 'tabPanel'.
+- Stack Trace
javax.el.PropertyNotWritableException: /main.xhtml @221,53 binding="#{pqHome.tabPanel}": The class 'de.mycomp.myproj.beans.PqHome' does not have a writable property 'tabPanel'.
at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:136)
at com.sun.faces.application.ApplicationImpl.createComponentApplyAnnotations(ApplicationImpl.java:1897)
at com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:1109)
at org.jboss.as.weld.webtier.jsf.ForwardingApplication.createComponent(ForwardingApplication.java:122)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.createComponent(ComponentTagHandlerDelegateImpl.java:511)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:157)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
at org.richfaces.view.facelets.html.BehaviorsAddingComponentHandlerWrapper.applyNextHandler(BehaviorsAddingComponentHandlerWrapper.java:55)
...
at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67)
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.jboss.as.web.NamingValve.invoke(NamingValve.java:57)
at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:49)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:154)
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:362)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:667)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951)
at java.lang.Thread.run(Unknown Source)
為什么JSF假設選項卡面板EL binding="#{pqHome.tabPanel}"
在這里可寫/可寫? 有沒有辦法解決這個問題,那就告訴JSF在這里閱讀?
注意:解決方法是取消注釋bean中的@ManagedProperty
和@PostConstruct
注釋,並在視圖中取消注釋<f:event ...>
,但后來我不知道為什么我應該使用<f:viewParam>
和<f:metadata>
根本......
謝謝
JSF只需要在支持bean中設置獲取的或自動創建的非null組件,就像你告訴它通過binding
做的那樣。 您需要提供一個setter方法。 沒有理由。 如果getter返回手動創建的組件,則只會設置相同的組件。 JSF不會設置自動創建的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.