未调用JSF操作方法

未调用JSF操作方法,jsf,methods,action,Jsf,Methods,Action,我有一个JSF视图,其中包含一个Primefaces数据表和一个命令按钮,如下所示: <p:messages id="statusMessages" showDetail="true" /> <h:form id="listForm"> <p:panel header="Wellsite List"> <br />

我有一个JSF视图,其中包含一个Primefaces数据表和一个命令按钮,如下所示:

<p:messages id="statusMessages" showDetail="true" />
    <h:form id="listForm">
        <p:panel header="Wellsite List">
            <br />
            <h:outputLabel value="Welcome, #{wellsiteController.loggedUser.login}" />
            <br />
            <br />
            
            <p:dataTable id="dataTable" var="wellsite" value="#{wellsiteController.wellsiteDataTableModel}"
                         paginator="true" rows="10" selection="#{wellsiteController.wellsite}">

                <p:column selectionMode="single" style="width:18px" id="radioSelect" />

                <p:column sortBy="#{wellsite.reference}" headerText="Wellsite ID">
                    <h:outputText value="#{wellsite.reference}" />
                </p:column>

                <p:column headerText="Allowed Groups">
                    <h:outputText value="#{wellsite.allowedGroups.toString()}" />
                </p:column>

                <f:facet name="footer">
                    <h:panelGrid columns="3">
                        <p:commandButton id="addWellsite" value="Add New Wellsite" icon="ui-icon-flag" ajax="false" action="#{wellsiteController.showAddWellsite}"/>
                        <p:commandButton id="editWellsite" value="Edit Selected Wellsite" icon="ui-icon-wrench" ajax="false" action="#{wellsiteController.showEditWellsite}"/>

                        <p:commandButton id="deleteWellsiteButton" value="Remove Selected Wellsite" icon="ui-icon-trash" onclick="confirmation.show()" type="button"/>
                         
                    </h:panelGrid>
                </f:facet>
            </p:dataTable>
            <p:spacer height="20" />
        </p:panel>
        <p:confirmDialog id="confirmDialog" message="Are you sure you want to remove the selected Wellsite along with all it's data?" header="Confirmation" severity="alert" widgetVar="confirmation">  
            <p:commandButton id="confirm" value="Yes" ajax="false" oncomplete="confirmation.hide()" action="#{wellsiteController.deleteWellsite}" />
            <p:commandButton id="decline" value="Cancel" onclick="confirmation.hide()" type="button" />   

        </p:confirmDialog>
    </h:form>




这是控制器:

@ManagedBean(name = "wellsiteController")
@RequestScoped
public class WellsiteController implements Serializable {
private static final long serialVersionUID = 1L;

@ManagedProperty("#{wellsiteDao}")
private WellsiteDao wellsiteDao;

@ManagedProperty("#{userDao}")
private UserDao userDao;

@ManagedProperty("#{groupDao}")
private GroupDao groupDao;

@ManagedProperty("#{userController.loggedUser}")
private UserEnt loggedUser;

private WellsiteEnt wellsite;
private List<WellsiteEnt> wellsiteList;
DualListModel<GroupEnt> pickGroupsModel;

public WellsiteController(){
}

@PostConstruct
public void build(){
    wellsite = new WellsiteEnt();
    wellsite.setAllowedGroups(new ArrayList<GroupEnt>());
}

/*some getters & setters*/

public WellsiteDataTableModel getWellsiteDataTableModel(){
    return new WellsiteDataTableModel(getWellsiteList());
}

public void setPickGroupsModel(DualListModel<GroupEnt> model){
    pickGroupsModel = model;
}

public DualListModel<GroupEnt> getPickGroupsModel() {
    if(pickGroupsModel == null){
        List<GroupEnt> allGroups = groupDao.getAll();
        List<GroupEnt> currentGroups = wellsite.getAllowedGroups();
        for(GroupEnt g : currentGroups){
            allGroups.remove(g);
        }
        pickGroupsModel = new DualListModel<GroupEnt>(allGroups, currentGroups);
    }
    return pickGroupsModel;
}

public String listWellsites(){
    getWellsiteList();
    return "listWellsites";
}

public String showAddWellsite(){
    FacesContext context = FacesContext.getCurrentInstance();
    setWellsite(new WellsiteEnt());
    wellsite.setAllowedGroups(new ArrayList<GroupEnt>());
    pickGroupsModel = null;
    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
                                            "Fields annotated with a ' * ' are mandatory",""));
    return "addWellsite";
}

public String addWellsite(){
    FacesContext context = FacesContext.getCurrentInstance();
    
    wellsite.setDate(new Date());
    wellsite.setLastUpdate(wellsite.getDate());
    try {
        wellsiteDao.addWell(wellsite);
        
        for(GroupEnt g : pickGroupsModel.getTarget()){
            GroupEnt group = groupDao.getOne(g.getGroupId());
            group.getGroupWellsites().add(wellsite);
            groupDao.update(group);
        }
        return listWellsites();
        
    } catch (Exception ex) {
        Logger.getLogger(WellsiteController.class.getName()).log(Level.SEVERE, null, ex);
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                            ex.getMessage(),""));
        return null;
    }
}
}
@ManagedBean(name=“wellsiteController”)
@请求范围
公共类WellsiteController实现可序列化{
私有静态最终长serialVersionUID=1L;
@ManagedProperty(“wellsiteDao”)
私人井场道井场道;
@ManagedProperty(“#{userDao}”)
私有UserDao UserDao;
@ManagedProperty(“#{groupDao}”)
私有的GroupDao-GroupDao;
@ManagedProperty(“#{userController.loggedUser}”)
私人用户日志;
私人井场;
私人名单和网站名单;
DualListModel pickGroupsModel;
公共井站控制员(){
}
@施工后
公共void build(){
井场=新井场();
wellsite.SetAlloweGroups(新ArrayList());
}
/*一些能手和二传手*/
公共WellsiteDataTableModel getWellsiteDataTableModel(){
返回新的WellsiteDataTableModel(getWellsiteList());
}
public void setPickGroupsModel(DualListModel模型){
pickGroupsModel=模型;
}
公共DualListModel getPickGroupsModel(){
if(pickGroupsModel==null){
List allGroups=groupDao.getAll();
List currentGroups=wellsite.getAlloweGroups();
对于(GroupEnt g:currentGroups){
所有组。移除(g);
}
pickGroupsModel=新的DualListModel(所有组、当前组);
}
返回pickGroupsModel;
}
公共字符串listWellsites(){
getWellsiteList();
返回“listWellsites”;
}
公共字符串showAddWellsite(){
FacesContext context=FacesContext.getCurrentInstance();
setWellsite(新的WellsiteEnt());
wellsite.SetAlloweGroups(新ArrayList());
pickGroupsModel=null;
context.addMessage(空,新FacesMessage(FacesMessage.SEVERITY_INFO,
“带“*”注释的字段为必填项”、“”);
返回“addWellsite”;
}
公共字符串addWellsite(){
FacesContext context=FacesContext.getCurrentInstance();
井场。设置日期(新日期());
wellsite.setLastUpdate(wellsite.getDate());
试一试{
wellsiteDao.addWell(井场);
for(GroupEnt g:pickGroupsModel.getTarget()){
GroupEnt group=groupDao.getOne(g.getGroupId());
group.getGroupWellsites().add(wellsite);
更新(组);
}
返回listWellsites();
}捕获(例外情况除外){
Logger.getLogger(WellsiteController.class.getName()).log(Level.SEVERE,null,ex);
context.addMessage(空,新FacesMessage(FacesMessage.SEVERITY_错误,
例如getMessage(),“”);
返回null;
}
}
}
此视图将正确渲染。datatable和按钮看起来不错。问题是,当我第一次单击“addWellsite”命令按钮时,什么也没发生。这一页似乎正在刷新。如果我再次单击它,发生异常时:

java.lang.NumberFormatException:对于输入字符串:“null”

使用调试器,我发现“addWellsite”的操作不是第一次调用的,因此不会生成结果(因此,页面刷新)

异常可能是由于当前视图或目标视图中缺少初始化(因为这两个视图都是通过页面刷新中未调用的操作方法显示的)

问题是:为什么不第一次调用action方法?

自:

每当
ui命令
组件调用相关操作失败时,请验证以下内容:

  • UICommand
    组件必须放置在
    UIForm
    组件中(例如
    h:form
  • 我有一张h:表格

  • 您不能将多个
    UIForm
    组件嵌套在一起(注意包含文件!)
  • 只有一个

  • 不应发生任何验证/转换错误(使用
    h:messages
    获取所有消息)
  • 我有一个h:消息,它不显示任何错误

  • 如果
    UICommand
    组件放置在
    UIData
    组件中,请确保完全相同的
    DataModel
    (UIData的
    属性后面的对象)被保留
  • commandButton位于dataTable内部,但目标视图不需要dataModel。正如我的控制器代码所示,对象是在视图尝试检索它时生成的。下一个请求不是使用这个数据表,因为我不再处理它了

  • 在应用请求值阶段,组件和所有父组件的
    呈现属性和
    禁用属性不应计算为
    false
  • 没有
    呈现
    取消
    属性

  • 确保请求-响应链中没有任何
    PhaseListener
    或任何
    EventListener
    更改JSF生命周期以跳过调用操作阶段
  • 未定义任何相位侦听器

  • 确保同一请求-响应链中没有
    过滤器
    Servlet
    以某种方式阻止了
    FacesServlet
    的请求
  • 没有定义其他Servlet。我甚至不知道过滤器是什么


    为什么不第一次调用action方法?

    当此
    的父对象被呈现在
    <h:commandButton ...>
       <f:ajax ... render=":listForm" />
    </h:commandButton>
    
    <p:commandButton ... update=":listForm" />