Metoda wywołania JSF nie jest wywoływana

Mam widok JSF z tabelą danych Primefaces i przyciskiem polecenia w miejscu, tak jak w przypadku fallows:

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

A oto kontroler:

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

Ten widok jest renderowany poprawnie. Dane i przyciski wyglądają dobrze. Problem polega na tym, że po pierwszym kliknięciu przycisku „addWellsite” nic się nie dzieje. Strona wydaje się odświeżać. Jeśli kliknę ponownie, wyjątek:

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

Korzystając z debugera, dowiedziałem się, że akcja „addWellsite” NIE jest wywoływana za pierwszym razem, więc nie jest generowany wynik (a więc odświeżanie strony).

Wyjątek prawdopodobnie wynika z braku inicjalizacji w bieżącym lub docelowym widoku (ponieważ oba widoki są wyświetlane z metod akcji, które nie zostały wywołane w odświeżaniu strony)

Pytanie brzmi:DLACZEGO metoda akcji nie jest nazywana po raz pierwszy?

Odta odpowiedź:

KiedykolwiekUICommand komponent nie może wywołać powiązanej akcji, sprawdź następujące elementy:

UICommand elementy muszą być umieszczone wewnątrzUIForm komponent (np.h:form).

Mam formularz h :.

Nie możeszgniazdo wielokrotnośćUIForm składniki w sobie (uważaj na pliki dołączane!).

Jest tylko jeden.

Nie powinien wystąpić błąd walidacji / konwersji (użyjh:messages zdobyć je wszystkie).

Mam h: wiadomości, które nie wyświetlają żadnego błędu.

JeśliUICommand komponenty są umieszczone wewnątrzUIData komponent, upewnij się, że dokładnie tak samoDataModel (obiekt zaUIDatajestvalue atrybut) jest zachowany.

Komenda commandButton znajduje się wewnątrz dataTable, ale widok docelowy nie potrzebuje modelu dataModel. Jak pokazuje mój kod kontrolera, obiekt jest budowany, gdy widok próbuje go odzyskać. Następna prośba nie używa tej tabeli danych, aby nie obsługiwać jej już.

Therendered idisabled atrybuty komponentu i wszystkich komponentów macierzystych nie powinny być ocenianefalse podczas fazy stosowania wartości żądania.

Nie marendered lubdisbled atrybuty.

Upewnij się, że niePhaseListener lub jakikolwiekEventListener w łańcuchu żądanie-odpowiedź zmienił cykl życia JSF, aby pominąć fazę działania invoke.

Nie zdefiniowano elementu phaseListener.

Upewnij się, że nieFilter lubServlet w tym samym łańcuchu żądanie-odpowiedź zablokował żądanieFacesServlet jakoś.

Nie zdefiniowano żadnego innego serwletu. Nie wiem nawet, co to jest filtr.

DLACZEGO metoda akcji nie jest nazywana po raz pierwszy?

questionAnswers(1)

yourAnswerToTheQuestion