簡體   English   中英

JSF 2:bean上的屬性假定是寫入而不是讀取?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM