Java 为什么JSF2(PrimeFaces3)Ajax属性侦听器没有触发?

Java 为什么JSF2(PrimeFaces3)Ajax属性侦听器没有触发?,java,tomcat,jsf-2,primefaces,Java,Tomcat,Jsf 2,Primefaces,我有一个数据表,每一行都有编辑和删除按钮。 它几乎类似于datatable 当我单击编辑按钮时,如果我使用显示所选行值,则值将正确显示。 但是,如果我想使用在输入文本字段中显示它,就会抛出错误,说selectedUser被解析为null 如果我只使用,那么userCRUDMB.selectedUser()方法将被正确调用。 但是如果在对话框中使用,则根本不会调用setter方法 我使用的是Mojarra 2.1.6、PrimeFaces 3.0、ApacheTomcat7.0.32 知道为什么会

我有一个数据表,每一行都有编辑和删除按钮。 它几乎类似于datatable

当我单击编辑按钮时,如果我使用
显示所选行值,则值将正确显示。 但是,如果我想使用
在输入文本字段中显示它,就会抛出错误,说
selectedUser被解析为null

如果我只使用
,那么
userCRUDMB.selectedUser()
方法将被正确调用。 但是如果在对话框中使用
,则根本不会调用setter方法

我使用的是Mojarra 2.1.6、PrimeFaces 3.0、ApacheTomcat7.0.32

知道为什么会这样吗

代码:代码与相同,只是在对话框中,而不是在输入文本框中使用显示文本

public class User 
{
    private Integer userId;
    private String userName;
    private String password;
    private String firstname;
    private String lastname;
    private String email;
    private Date dob;
    private String gender;

    //setters/getters
}



package com.sivalabs.primefacesdemo.managedbeans;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

import com.sivalabs.primefacesdemo.model.User;
import com.sivalabs.primefacesdemo.model.UserDataModel;
import com.sivalabs.primefacesdemo.service.SpringContainer;
import com.sivalabs.primefacesdemo.service.UserService;


@ManagedBean(name="UserCRUDMB")
@RequestScoped
public class UserCRUDMB 
{

    private UserDataModel userDataModel;
    private User selectedUser;
    private User[] selectedUsers;

    public UserCRUDMB() 
    {
        List<User> users = new ArrayList<User>();
        for (int i = 0; i < 15; i++) {
            User user = new User();
            user.setUserId(i);
            user.setUserName("userName"+i);
            users.add(user);
        }
        this.userDataModel = new UserDataModel(users);      
    }

    public UserDataModel getUserDataModel() {
        return userDataModel;
    }

    public void setUserDataModel(UserDataModel userDataModel) {
        this.userDataModel = userDataModel;
    }

    public User[] getSelectedUsers() {
        return selectedUsers;
    }

    public void setSelectedUsers(User[] selectedUsers) {
        this.selectedUsers = selectedUsers;
    }

    public User getSelectedUser() {
        System.out.println("get-->"+selectedUser);
        return selectedUser;
    }

    public void setSelectedUser(User selectedUser) {
        System.out.println("set--->"+selectedUser);
        this.selectedUser = selectedUser;
    }
}



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:c="http://java.sun.com/jsp/jstl/core"
      xmlns:p="http://primefaces.org/ui"> 

<h:head>
</h:head> 
<body> 
    <h:form id="form">
        <h:outputText value="PrimeFaces Demo - ShowUsers" />

        <p:dataTable value="#{UserCRUDMB.userDataModel}" var="userObj"
                     selection="#{UserCRUDMB.selectedUsers}"
                     widgetVar="usersTbl">

            <f:facet name="header">UserManagement</f:facet>
            <p:column selectionMode="multiple"></p:column>
            <p:column headerText="UserId">#{userObj.userId}</p:column>
            <p:column headerText="UserName">#{userObj.userName}</p:column>

            <p:column>
                <p:commandButton value="Edit" 
                                 oncomplete="userEditDlg.show()"
                                 update="form:userEditTbl">
                    <f:setPropertyActionListener target="#{UserCRUDMB.selectedUser}" value="#{userObj}"></f:setPropertyActionListener>
                </p:commandButton>

            </p:column>
            <p:column>
                <p:commandButton value="Delete" action="#{UserCRUDMB.deleteUser}" 
                                 update="usersTbl"
                                 ajax="true">
                    <f:setPropertyActionListener target="#{UserCRUDMB.selectedUser}" value="#{userObj}"></f:setPropertyActionListener>
                </p:commandButton>

            </p:column>

            <f:facet name="footer">
                <p:commandButton value="Delete Selected" action="#{UserCRUDMB.deleteUsers}" 
                                 update="usersTbl"
                                 ajax="true">
                </p:commandButton>
            </f:facet>
        </p:dataTable>
        <p:dialog widgetVar="userEditDlg" header="User Edit Form" hideEffect="explode"
                                minHeight="200" minWidth="300">
            <h:panelGrid columns="2" id="userEditTbl" >
                <h:outputLabel value="UserId" />
                <h:outputText value="#{UserCRUDMB.selectedUser.userId}"/>

                <h:outputLabel value="UserName" />
                <h:inutText value="#{UserCRUDMB.selectedUser.userName}"/>

            </h:panelGrid>

        </p:dialog>     
    </h:form>

</body> 
</html>
公共类用户
{
私有整数用户标识;
私有字符串用户名;
私有字符串密码;
私有字符串名;
私有字符串lastname;
私人字符串电子邮件;
私人约会日期;
私人字符串性别;
//二传手
}
包com.sivalabs.primefacesdemo.managedbeans;
导入java.util.ArrayList;
导入java.util.List;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.RequestScope;
导入com.sivalabs.primefacesdemo.model.User;
导入com.sivalabs.primefacesdemo.model.UserDataModel;
导入com.sivalabs.primefacesdemo.service.SpringContainer;
导入com.sivalabs.primefacesdemo.service.UserService;
@ManagedBean(name=“UserCRUDMB”)
@请求范围
公共类UserCRUDMB
{
私有UserDataModel UserDataModel;
私人用户选择用户;
私人用户[]选择用户;
公共用户crudmb()
{
列表用户=新建ArrayList();
对于(int i=0;i<15;i++){
用户=新用户();
user.setUserId(i);
user.setUserName(“用户名”+i);
用户。添加(用户);
}
this.userDataModel=新的userDataModel(用户);
}
公共UserDataModel getUserDataModel(){
返回userDataModel;
}
public void setUserDataModel(UserDataModel UserDataModel){
this.userDataModel=userDataModel;
}
公共用户[]getSelectedUsers(){
返回所选用户;
}
公共无效设置selectedUsers(用户[]selectedUsers){
this.selectedUsers=selectedUsers;
}
公共用户getSelectedUser(){
System.out.println(“get-->”+selectedUser);
返回所选的用户;
}
公共无效设置selectedUser(用户选择的用户){
System.out.println(“设置--->”+选择的用户);
this.selectedUser=selectedUser;
}
}
用户管理
#{userObj.userId}
#{userObj.userName}
谢谢,
Siva

如果您使用的是ajax,那么请求范围不是“理想”范围,因为bean将为每个请求重新创建。这可能是
selectedUser
为空的原因。改为使用视图范围(
@ViewScoped
)。

发布bean和页面的代码。这样应该更容易帮助您。发布了代码片段。您提供的代码不适合您的问题。请发布您的代码,而不是primefaces showcase中的代码。bean代码和jsf数据表对于查找错误源也很重要。名称有什么大不了的!!!我有一个UserCRUDMB,它和一个TableBean完全一样,而不是我选择的selectedCar。不管怎么说,我改变了我原来的问题和代码,仍然得到了相同的错误。“大不了”的是Primefaces showcase中的代码有效,而您的代码显然无效。因此,从PF showcase复制/粘贴代码毫无意义。