JSF-Aktionsmethode wird nicht aufgerufen

Ich habe eine JSF-Ansicht mit einer Primefaces-Datentabelle und einer Befehlsschaltfläche, wie folgt:

<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>

Und hier ist der Controller:

@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;
    }
}
}

Diese Ansicht wird korrekt gerendert. Die Datentabelle und die Schaltflächen sehen gut aus. Das Problem ist, dass, wenn ich zuerst auf den "addWellsite" -Befehlsschalter klicke, nichts passiert. Die Seite scheint nur zu aktualisieren. Wenn ich nochmal klicke, passiert ausnahmsweise:

java.lang.NumberFormatException: For input string: "null"

Mit einem Debugger habe ich herausgefunden, dass die Aktion von "addWellsite" NICHT beim ersten Mal aufgerufen wird und daher kein Ergebnis generiert wird (daher die Seitenaktualisierung).

Die Ausnahme ergibt sich wahrscheinlich aus der fehlenden Initialisierung in der aktuellen oder der Zielansicht (da beide Ansichten von Aktionsmethoden angezeigt werden, die bei der Seitenaktualisierung nicht aufgerufen wurden).

Die Frage ist:WARUM wird die Aktionsmethode nicht beim ersten Mal aufgerufen?

Abdiese Antwort:

Wann immer einUICommand Die Komponente kann die zugeordnete Aktion nicht aufrufen. Überprüfen Sie Folgendes:

UICommand Die Komponenten müssen innerhalb einesUIForm Komponente (z.h:form).

Ich habe eine h: Form

Du kannst nichtNest mehrereUIForm Komponenten ineinander (Achtung bei Include-Dateien!).

Es gibt nur einen.

Es sollte kein Validierungs- / Konvertierungsfehler aufgetreten sein (Verwendungh:messages um sie alle zu bekommen).

Ich habe eine h: -Nachricht, die keinen Fehler anzeigt.

ObUICommand Komponenten befinden sich in einemUIData Komponente, stellen Sie sicher, dass genau das gleicheDataModel (das Objekt hinter demUIData'svalue Attribut) bleibt erhalten.

Die Befehlsschaltfläche befindet sich in der Datentabelle, die Zielansicht benötigt jedoch nicht das Datenmodell. Wie mein Controller-Code zeigt, wird das Objekt erstellt, während die Ansicht versucht, es abzurufen. Die nächste Anfrage verwendet diese Datentabelle nicht, um sie nicht mehr zu bearbeiten.

Dasrendered unddisabled Attribute der Komponente und aller übergeordneten Komponenten sollten nicht ausgewertet werdenfalse während der Phase Anforderungswerte anwenden.

Da ist keinrendered oderdisbled Attribute.

Stellen Sie sicher, dass neinPhaseListener oder irgendeinEventListener In der Anforderungs-Antwort-Kette wurde der JSF-Lebenszyklus geändert, um die Aktionsphase für den Aufruf zu überspringen.

Es ist kein phaseListener definiert.

Stellen Sie sicher, dass neinFilter oderServlet in der gleichen Anfrage-Antwort-Kette hat die Anfrage für die blockiertFacesServlet irgendwie.

Es ist kein anderes Servlet definiert. Ich weiß nicht mal, was ein Filter ist.

WARUM wird die Aktionsmethode nicht beim ersten Mal aufgerufen?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage