【问题标题】:Consultation List cast an object in Primefaces?咨询列表在 Primefaces 中投射对象?
【发布时间】:2013-09-27 15:44:10
【问题描述】:

我有一个带有primefaces的数据表,加载了大约三个记录,碰巧我在第一列有inputText,碰巧按钮在数据记录之外,然后单击我要记录的按钮,捕获我的inputText值​​,并更新每个dataTable的记录。

    <p:dataTable id="dataTable" var="confParamGen" value="#{regRolMB.paramLdap}"
        rowIndexVar="rowIndex"> 
        <p:column>
            <f:facet name="header" >
                <h:outputText value="N°" />
            </f:facet>
            <h:outputText value="#{rowIndex+1}" />
        </p:column>
        <p:column>
            <f:facet name="header">
                <h:outputText value="Number Long" />
            </f:facet>
            <h:outputText value="#{confParamGen.numberCort}" />
        </p:column> 
        <p:column>
            <f:facet name="header">
                <h:outputText value="Value Role" />
            </f:facet>
            <p:inputText value="#{confParamGen.valuesRole}" style="width: 200px;" />
        </p:column> 
</p:dataTable>

<p:commandButton value="Save" rendered="#{regRolMB.showButtonUpdate}"
actionListener="#{regRolMB.actualizarRol}" styleClass="positionButton"> 
    <f:attribute name="confParamGen" value="#{confParamGen}" />
</p:commandButton>

在控制器中我是这样的,但是它会强制转换 Arraylist。

public void updateRol(ActionEvent event) {
    List<DateGeneral> rolConPar = new ArrayList<DateGeneral>();
    rolConPar = ((ArrayList<DateGeneral>) event.getComponent().getAttributes().get("confParamGen"));
    for(DateGeneral dato: rolConPar){
        System.out.println("===> "+dato.getValuesRole());
    }
}   

我得到这个错误,虽然问题不是inputText的修改数据捕获,只是捕获从DataTable加载的数据

java.lang.ClassCastException: com.bbva.sca.adm.bean.DatoGeneral cannot be cast to java.util.ArrayList

【问题讨论】:

    标签: jsf primefaces datatable parameter-passing


    【解决方案1】:

    ClassCastException 被抛出,因为您实际上已在此处将 DatoGeneral 的实例设置为属性:

    <f:attribute name="confParamGen" value="#{confParamGen}" />
    

    这显然不是 List&lt;DatoGeneral&gt;(或 List&lt;DateGeneral&gt; 或您在粗心地过度简化/翻译代码时所犯的任何错字;在代码中始终使用英语)。从技术上讲,您可以通过传递列表本身来解决它:

    <f:attribute name="confParamGen" value="#{regRolMB.paramLdap}" />
    

    毕竟,这种方法没有任何意义。您的唯一目的似乎只是收集提交的值。在这种情况下,您似乎对 JSF 完全陌生,还没有完全理解为什么要使用 JSF 以及它的全部功能。 JSF 已经使用提交的值更新了模型值。您只需直接访问&lt;p:dataTable value&gt; 后面的相同列表即可。

    public void actualizarRol(ActionEvent event) {
        for(DateGeneral dato: paramLdap){
            System.out.println("===> "+dato.getValuesRole());
        }
    }  
    

    这样你就可以摆脱整个&lt;f:attribute&gt;

    【讨论】:

    • 您好,这可行,但我想要的是捕获我在 InputText 中编辑的所有值。
    • 这应该可以。如果它不这样做,那么你就是因为在 getter 方法中错误地执行业务逻辑而变得顽皮。你不应该那样做。您应该在 @PostConstruct 带注释的方法中初始化数据表的数据,并保持 getter 方法不变。它应该只顾名思义:返回一个属性。而已。另见stackoverflow.com/questions/2090033/…
    • 我的数据表像这样加载它: public ArrayList getParamLdap() { try{ if(codSistema != null){ confParamGen = new ArrayList(); confParamGen = datoGeneralService.obtenerParamGen(sistema.getConfLdap().getCdCodigo()); } }catch(异常 e){ e.printStackTrace(); } return (ArrayList) confParamGen; }
    • 如前所述,getter 方法不应包含业务逻辑。 getter 方法应该看起来像这样public List&lt;DatoGeneral&gt; gerParamLdap() { return confParamGen; }。将初始化逻辑移至 @PostConstruct 注释方法。
    【解决方案2】:

    我的数据表是这样加载的:

    public ArrayList<DatoGeneral> getParamLdap() {
        try{
            if(codSistema != null){             
                confParamGen = new ArrayList<DatoGeneral>();
                confParamGen = datoGeneralService.obtenerParamGen(sistema.getConfLdap().getCdCodigo());
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return (ArrayList<DatoGeneral>) confParamGen;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 2015-01-10
      • 1970-01-01
      相关资源
      最近更新 更多