【问题标题】:Can't add values to an array on a Bean constructor无法将值添加到 Bean 构造函数上的数组
【发布时间】:2014-11-20 12:16:54
【问题描述】:

我试图在 ManagedBean 的构造函数上向数组中添加值,但我遇到了错误。

我正在尝试的是

@ManagedBean
@ViewScoped
public class EquipamentoBean {

    private List<Equipamento> equipamentos;

    private List<Equipamento> equipamentosFiltrados;

    private List<EquipamentoTipo> tipos;

    public EquipamentoBean(){
        this.equipamentos = new EquipamentoDao().listaEquipamentos();
        for (Equipamento equipamento : equipamentos) {
            this.tipos.add(equipamento.getEquipamentoTipoId());
        }
//      this.tipos = new EquipamentoTipoDao().listaTipos(); WORKS, BUT NEEDS ANOTHER MYSQL CONNECTION
    }

在我的 Equipamento 类中,我有一个 EquipamentoTipo,因此每个 Equipamento 都与一个 EquipamentoTipo 相关联,关系为 1-N。 我需要使用 EquipamentoTipo 作为我显示的数据表上的过滤器,因此我决定创建一个 EquipamentoTipo 列表并使用我已经拥有的 equipamento 列表填充它,而不是与 dabatase 建立另一个连接并检索所有 EquipamentoTipo。

我不明白为什么我可以用另一个类的方法填充我的列表,但不能用另一个列表填充它。

我的 xhtml

<p:column filterBy="#{equipamento.equipamentoTipoId}" 
          sortBy="#{equipamento.equipamentoTipoId}" 
          headerText="Tipo">
            <f:facet name="filter">
                <p:selectOneMenu onchange="PF('equipamentoTable').filter()">
                    <f:selectItem itemLabel="Selecione" 
                                  itemValue="#{null}" 
                                  noSelectionOption="true">
                    </f:selectItem>
                    <f:selectItems value="#{equipamentoBean.tipos}">
                    </f:selectItems>
                </p:selectOneMenu>
            </f:facet>
            <h:outputText value="#{equipamento.equipamentoTipoId}">
            </h:outputText>
        </p:column>

错误

exception

javax.servlet.ServletException: Cant instantiate class: br.com.timbrasil.network.bean.EquipamentoBean.
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

root cause

com.sun.faces.mgbean.ManagedBeanCreationException: Cant instantiate class: br.com.timbrasil.network.bean.EquipamentoBean.
    com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:191)
    com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:100)
    com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
    com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
    com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:257)
    com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:117)
    com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:80)
    org.apache.el.parser.AstValue.getValue(AstValue.java:135)
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:187)
    com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
    javax.faces.component.UIData.getValue(UIData.java:732)
    org.primefaces.component.datatable.DataTable.getValue(DataTable.java:1002)
    org.primefaces.component.api.UIData.getDataModel(UIData.java:629)
    javax.faces.component.UIData.getRowCount(UIData.java:356)
    org.primefaces.component.api.UIData.calculateFirst(UIData.java:175)
    org.primefaces.component.datatable.DataTableRenderer.preRender(DataTableRenderer.java:110)
    org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:82)
    javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
    javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:456)
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:133)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

root cause

java.lang.NullPointerException
    br.com.timbrasil.network.bean.EquipamentoBean.<init>(EquipamentoBean.java:26)
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    java.lang.Class.newInstance(Class.java:433)
    com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:186)
    com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:100)
    com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
    com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
    com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:257)
    com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:117)
    com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:80)
    org.apache.el.parser.AstValue.getValue(AstValue.java:135)
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:187)
    com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
    javax.faces.component.UIData.getValue(UIData.java:732)
    org.primefaces.component.datatable.DataTable.getValue(DataTable.java:1002)
    org.primefaces.component.api.UIData.getDataModel(UIData.java:629)
    javax.faces.component.UIData.getRowCount(UIData.java:356)
    org.primefaces.component.api.UIData.calculateFirst(UIData.java:175)
    org.primefaces.component.datatable.DataTableRenderer.preRender(DataTableRenderer.java:110)
    org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:82)
    javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
    javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:456)
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:133)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

【问题讨论】:

    标签: java list jsf primefaces managed-bean


    【解决方案1】:

    添加对象前必须先初始化arrayList;

    public EquipamentoBean(){
        this.equipamentos = new EquipamentoDao().listaEquipamentos();
        this.tipos = new ArrayList<EquipamentoTipo>();
        for (Equipamento equipamento : equipamentos) {
            this.tipos.add(equipamento.getEquipamentoTipoId());
        }
    }
    

    【讨论】:

    • IMO 使用@PostConstruct 方法来初始化东西是一种更好的做法和习惯。构造函数可能在这里工作,但最终会失败
    • @JaqenH'ghar 就像一个 public void init() whit #PostConstruct 并添加我让构造函数上的所有内容?
    • 没错,答案没有具体问题,但最好养成一个好习惯 - 始终将 init() 与 PostConstruct 一起使用,因为当您将其他 bean 注入其中时,构造方法将不起作用
    猜你喜欢
    • 2016-04-29
    • 2017-04-25
    • 2015-06-12
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 2014-04-22
    • 2021-06-15
    • 1970-01-01
    相关资源
    最近更新 更多