Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf primefaces行编辑中的event.getObject()将旧值发送到bean_Jsf_Jsf 2_Primefaces - Fatal编程技术网

Jsf primefaces行编辑中的event.getObject()将旧值发送到bean

Jsf primefaces行编辑中的event.getObject()将旧值发送到bean,jsf,jsf-2,primefaces,Jsf,Jsf 2,Primefaces,我正在尝试使用prime faces的功能,该功能允许用户编辑表本身中的行数据。我通过以下链接实现了该功能: 当我说编辑用户时,输入的新值不会发送到bean,它仍然只显示旧值 我在JSF中的代码: <p:dataTable value="#{mybean.userList}" var="item" id="dataTab" widgetVar="usersTable" tableStyleClass="data" pagi

我正在尝试使用prime faces的功能,该功能允许用户编辑表本身中的行数据。我通过以下链接实现了该功能:

当我说编辑用户时,输入的新值不会发送到bean,它仍然只显示旧值

我在JSF中的代码:

<p:dataTable value="#{mybean.userList}"
        var="item"
        id="dataTab"
        widgetVar="usersTable"
        tableStyleClass="data"  paginator="true" rows="5"  
        filteredValue="#{userController.filteredUsers}"
        editable="true"
        rowKey="#{item}">

    <p:ajax event="rowEdit"   listener="#{mybean.onEdit}" update=":userForm:growl" />  
    <p:ajax event="rowEditCancel" listener="#{mybean.onCancel}" update=":userForm:growl" /> 
    <f:facet name="header">
        <p:outputPanel>  
            <h:outputText value="Search all fields:" />  
            <p:inputText id="globalFilter"     onkeyup="('usersTable').filter()"   style="width:150px" />  
        </p:outputPanel>     
    </f:facet>


    <p:column sortBy="#{item.firstName}" filterBy="#{item.firstName}" 
        filterMatchMode="startsWith">
        <p:cellEditor> 
            <f:facet name="header">  
                <h:outputText value="First Name" />  
            </f:facet>
            <f:facet name="output">
                <h:outputText  value="#{item.firstName}" />
            </f:facet>
            <f:facet name="input">  
                <p:inputText value="#{item.firstName}" style="width:100%"/>  
            </f:facet>  
        </p:cellEditor>
    </p:column>
    <p:column  sortBy="#{item.lastName}" filterBy="#{item.lastName}" filterMatchMode="startsWith">
        <p:cellEditor> 
            <f:facet name="header">  
                <h:outputText value="Last Name" />  
            </f:facet>

            <p:column headerText="Update" style="width:6%">  
                <p:rowEditor />  
            </p:column>    


</p:dataTable>
bean中用于在ui中获取列表的代码:

 public List<UserBean> getUsersList(){
        List<UserBean> retval = new ArrayList<>();            
        for (Object[] tuple : myFacade.getUserList()) {
            UserBean ub = new UserBean();
            ub.setFirstName((String) tuple[0]);
            ub.setLastName((String)tuple[1]);
            ub.setEmailAddress((String)tuple[2]);
            ub.setOfficeNumber((String)tuple[3]);
            ub.setRole((String)tuple[4]);                
            retval.add(ub);
        }
        return retval;
    }
公共列表getUsersList(){ List retval=new ArrayList(); 对于(对象[]元组:myFacade.getUserList()){ UserBean ub=newuserbean(); ub.setFirstName((字符串)元组[0]); ub.setLastName((字符串)元组[1]); ub.setEmailAddress((字符串)元组[2]); ub.setOfficeNumber((字符串)元组[3]); ub.setRole((字符串)元组[4]); 返回。添加(ub); } 返回返回; }
我尝试了一些帖子中给出的建议,但都不起作用。有人能告诉我如何获得新值吗?我正在使用glassfish 4.0,primefaces 3.5。

我能够解决问题。每次在getter方法中获取列表时,我都会调用数据库来加载数据。但只有当列表为空时,才应执行此操作。以下代码为您提供了一个清晰的图像:

public List<UserBean> getUsersList(){


        if(retval == null)
        {
            retval = new ArrayList<>();

            for (Object[] tuple : myFacade.getUserList()) {
            UserBean ub = new UserBean();
            ub.setFirstName((String) tuple[0]);
            ub.setLastName((String)tuple[1]);
            ub.setEmailAddress((String)tuple[2]);
            ub.setOfficeNumber((String)tuple[3]);
            ub.setRole((String)tuple[4]);

            retval.add(ub);
        }
        }
        return retval;
    }
公共列表getUsersList(){ if(retval==null) { retval=newarraylist(); 对于(对象[]元组:myFacade.getUserList()){ UserBean ub=newuserbean(); ub.setFirstName((字符串)元组[0]); ub.setLastName((字符串)元组[1]); ub.setEmailAddress((字符串)元组[2]); ub.setOfficeNumber((字符串)元组[3]); ub.setRole((字符串)元组[4]); 返回。添加(ub); } } 返回返回; }
因此getUsersList是我在p:datatable中的var值,现在当我调用OneEdit时,它将检查列表是否为null,它执行数据库调用或不调用数据库。

在其他可能的问题中,您的代码没有正确关闭JSF标记。这是复制粘贴问题吗?听起来转换/验证失败了。你能在表单中添加一个消息组件来验证吗?@patstuart是的,这只是一个复制粘贴错误,在我的jsf页面中没有问题。@kolossus我添加了消息组件p:growl,它没有显示任何验证/转换错误。我只是将名字从“abc”改为“abcd”。老实说,这几乎是不可能的,因为你发布的代码有各种各样的问题。您正在getter中执行一个复杂的操作,这是您永远不应该做的(PrimeFaces将抛出各种fit)。您完全忽略了泛型,因此不可能知道传递了什么。您发布了usersList而不是userList的代码,它返回的似乎是UserBean的列表,而不是User。试着用你的代码修复一些基本的问题,也许你会在修复过程中发现错误。我也有同样的问题,这是正确的答案。谢谢在getter中执行业务逻辑是不可取的。相反,使用一些方法初始化bean,比如
f:viewAction
public List<UserBean> getUsersList(){


        if(retval == null)
        {
            retval = new ArrayList<>();

            for (Object[] tuple : myFacade.getUserList()) {
            UserBean ub = new UserBean();
            ub.setFirstName((String) tuple[0]);
            ub.setLastName((String)tuple[1]);
            ub.setEmailAddress((String)tuple[2]);
            ub.setOfficeNumber((String)tuple[3]);
            ub.setRole((String)tuple[4]);

            retval.add(ub);
        }
        }
        return retval;
    }