2012-01-09 128 views
1

我遇到了DataTable的問題。 我有一個SelectOneMenu組件與3個選項。每個選項都應使用不同的信息呈現數據表DataTable不顯示信息JSF

XHTML頁是否正常(我用一個簡單的代碼進行測試),但似乎我的支持bean沒有工作,我期待。當我運行該頁面時會拋出一條錯誤消息。

我的XHTML看起來像

<h:form> 
     <h:outputLabel for="reporte" value="Tipo de reporte: " /> 
     <h:selectOneMenu id="reporte" 
         value="#{reportController.type}"> 
      <f:selectItem itemLabel="Seleccione tipo de reporte..." itemValue="null" /> 
      <f:selectItems value="#{reportController.reportType}" /> 
      <f:ajax execute="@form" render="@form" /> 
     </h:selectOneMenu> 




     <h:panelGrid id="porSistema" 
        rendered="#{reportController.type == 'Por sistema'}"> 
      <h:dataTable value="#{reportController.list}" var="item" 
         border="1"> 
       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Nombre del archivo"/> 
        </f:facet> 
        <h:outputText value="#{item.fileName}"/> 
       </h:column> 
       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Registros correctos"/> 
        </f:facet> 
        <h:outputText value="#{item.registersOk}"/> 
       </h:column> 
       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Registros incorrectos"/> 
        </f:facet> 
        <h:outputText value="#{item.registersNok}"/> 
       </h:column> 
       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Registros procesados"/> 
        </f:facet> 
        <h:outputText value="#{item.registers}"/> 
       </h:column> 
      </h:dataTable> 
     </h:panelGrid> 
    </h:form> 

的bean是

@ManagedBean 
@ViewScoped 
public class ReportController { 

    List<Object> list = new ArrayList<Object>(); 
    String type; 
    String[] reportType = new String[]{"Por sistema", 
     "Por programa y componente", 
     "Por estatus de pago"}; 

    @PostConstruct 
    public void init() { 
     if (type.equals("Por sistema")) { 
      list.add(new ReporteSistema("A", "B", "C", "D")); 
     } else if (type.equals("Por programa y componente")) { 
      list.add(new ReporteProgramaComponenteA("E", "F", "G", "H", "I", "J")); 
     } else if (type.equals("Por estatus de pago")) { 
      list.add(new ReporteProgramaComponenteB("K", "L", "M", "N")); 
     } 
    } 

    public String[] getReportType() { 
     return reportType; 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    public List<Object> getList() { 
     return list; 
    } 

    public void setList(List<Object> list) { 
     this.list = list; 
    } 
} 

和堆棧跟蹤

com.sun.faces.mgbean.ManagedBeanCreationException: Se ha producido un error al realizar la inyección de recurso en el bean administrado reportController 
    at com.sun.faces.mgbean.BeanBuilder.invokePostConstruct(BeanBuilder.java:229) 
    at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:105) 
    at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409) 
    at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269) 
    at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:244) 
    at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:116) 
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) 
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) 
    at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:71) 
    at org.apache.el.parser.AstValue.getValue(AstValue.java:147) 
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189) 
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109) 
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) 
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182) 
    at javax.faces.component.UIOutput.getValue(UIOutput.java:169) 
    at com.sun.faces.renderkit.html_basic.MenuRenderer.getCurrentSelectedValues(MenuRenderer.java:648) 
    at com.sun.faces.renderkit.html_basic.MenuRenderer.renderOptions(MenuRenderer.java:749) 
    at com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:844) 
    at com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:298) 
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1764) 
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:168) 
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:401) 
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at mx.gob.sagarpa.NoCacheFilter.doFilter(NoCacheFilter.java:29) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:349) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: com.sun.faces.spi.InjectionProviderException 
    at com.sun.faces.vendor.WebContainerInjectionProvider.invokeAnnotatedMethod(WebContainerInjectionProvider.java:119) 
    at com.sun.faces.vendor.WebContainerInjectionProvider.invokePostConstruct(WebContainerInjectionProvider.java:99) 
    at com.sun.faces.mgbean.BeanBuilder.invokePostConstruct(BeanBuilder.java:223) 
    ... 56 more 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.GeneratedMethodAccessor85.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.sun.faces.vendor.WebContainerInjectionProvider.invokeAnnotatedMethod(WebContainerInjectionProvider.java:117) 
    ... 58 more 
Caused by: java.lang.NullPointerException 
    at mx.gob.sagarpa.beans.ReportController.init(ReportController.java:32) 
    ... 62 more 
+0

看看ReportController.java的第32行是什麼 – perissf 2012-01-09 15:54:42

+0

是的,NullPointerException正在使我的頁面崩潰。第32行是'if(type.equals(「Something」))''所以我想變量**類型**爲空,但是它應該在SelectOneMenu的值改變時改變......所以爲什麼它拋出一個NullPointerException? – BRabbit27 2012-01-09 16:02:13

回答

1

您似乎誤解了@PostConstruct的目的。此註釋用於指定在bean構建後將直接執行的方法。此註釋允許您在之後執行代碼注入由@ManagedProperty指定的託管屬性以及所有其他依賴項,如@Inject@EJB。那些注入的屬性和依賴關係在bean的構造函數中是不可用的(當然,在所有注入發生之前,必須首先獲得bean的完全構造的實例)。視圖範圍bean的@PostConstruct在您發送ajax請求時不會被調用。只有在最初在瀏覽器中打開頁面時纔會調用它。

實際上您想在觸發ajax事件時調用該方法。您需要按如下方式更改視圖和bean以使其運行。

<h:selectOneMenu id="reporte" value="#{reportController.type}"> 
    <f:selectItem itemLabel="Seleccione tipo de reporte..." itemValue="null" /> 
    <f:selectItems value="#{reportController.reportType}" /> 
    <f:ajax execute="@form" listener="#{reportController.changeType}" render="@form" /> 
</h:selectOneMenu> 

(注意新listener屬性)

public void changeType() { // No, do not put @PostConstruct on it! 
    if ("Por sistema".equals(type)) { 
     list.add(new ReporteSistema("A", "B", "C", "D")); 
    } else if ("Por programa y componente".equals(type)) { 
     list.add(new ReporteProgramaComponenteA("E", "F", "G", "H", "I", "J")); 
    } else if ("Por estatus de pago".equals(type)) { 
     list.add(new ReporteProgramaComponenteB("K", "L", "M", "N")); 
    } 
} 

另外請注意,我換了equals()左右兩側,你可以保證它不會拋出NPE 。如果type碰巧是null,那麼它將被簡單地比較爲不相等。當你真的在null上調用equals()時,你肯定會得到一個NPE(這就是整個例外的意義!另請參閱its javadoc)。

+0

非常感謝! – BRabbit27 2012-01-10 18:01:00

+0

不客氣。 – BalusC 2012-01-10 18:08:27

1

您的問題是在堆棧跟蹤顯然說明。你的init方法扔了NullPointerException。確切地說,你的type變量沒有被賦予任何值。你不能用它調用equals函數。