preRenderView не работает во время вызова метода

У меня есть на моей странице JSF 2.2 прослушиватель событий в <f:metadata>, и его preRenderView не работает при каждом вызове страницы, он работает только для первой загрузки страницы, и когда я использую метод add(), списки обновляются при отображении добавленной строки, но я вообще не могу заставить его работать для моего метода delete(), ничего не удаляется, и представление также не обновляется.

Но все работает нормально, если я игнорирую meta tag и просто загружаю список в методе getListe(), но я не должен помещать бизнес-код в getter.

профиль.xhtml

<!DOCTYPE html>
<html lang="fr"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <f:metadata>
            <f:event type="preRenderView" listener="#{profileBean.loadFermes}" />
    </f:metadata>
    <h:head>
        <title>SUCCES</title>
    </h:head>

    <h:body>

        <ui:fragment rendered= "#{!loginBean.loggedIn}">
        Not logged !
        </ui:fragment>
        <ui:fragment rendered= "#{loginBean.loggedIn}">
        Welcome : #{loginBean.user.nom} <br />
        E-mail : #{loginBean.user.email} <br />
        <br />


        <h:form id="form">
            <h:panelGroup id="wrapper">

                <h:outputLabel for="nomFerme">Nom Ferme<span class="requis"></span></h:outputLabel>
                <h:inputText id="nomFerme" value="#{profileBean.ferme.nom_ferme}" size="20" maxlength="20" />
                <h:messages globalOnly="true" infoClass="info" />
                <h:commandButton value="Add" action="#{profileBean.addFerme}" styleClass="sansLabel">
                    <f:ajax execute="@form" render="@form" />
                </h:commandButton>
                <br />

            <h:dataTable id="ferme-table" value="#{profileBean.liste}" 
                         var="f" rules="all" cellpadding="4" cellspacing="0">            

                <f:facet name="header">
                  <h:outputText value="Ferme List" />
                </f:facet> 

                <h:column>
                  <f:facet name="header">
                  <h:outputText value="Ferme Id" />
                  </f:facet> 
                   <h:outputText value="#{f.id_ferme}" />
                </h:column>

                <h:column>
                  <f:facet name="header">
                  <h:outputText value="Name"/>
                  </f:facet> 
                   <h:outputText value="#{f.nom_ferme}"  />
                </h:column> 

                <h:column>
                  <f:facet name="header">
                  <h:outputText value="User Id"/>
                  </f:facet> 
                   <h:outputText value="#{f.utilisateur.id}"  />
                </h:column>                         

                <h:column>
                  <f:facet name="header">
                  <h:outputText value="Action"/>
                  </f:facet>
                     <h:panelGroup class="action" >
                        <h:commandLink value="Delete" action="#{profileBean.deleteFerme(f)}" >
                        <f:ajax execute="@form" render="@form" />
                        </h:commandLink>

                        <h:link outcome="editFerme" value="Edit" includeViewParams="true">
                            <f:param name="fermeId" value="#{f.id_ferme}"></f:param>
                        </h:link>
                    </h:panelGroup>
                </h:column>
            </h:dataTable>
            </h:panelGroup>
        </h:form>
        </ui:fragment>

    </h:body>
</html>

профильБин:

@Named
@RequestScoped
public class ProfileBean implements Serializable{

    private static final long serialVersionUID = 1L;

    // injecting the SessionScoped Bean containing the logged User object
    @Inject
    private LoginBean loginBean;

    private Ferme ferme;
    private List<Ferme> liste;

    public Ferme getFerme() {
        return ferme;
    }

    public void setFerme(Ferme ferme) {
        this.ferme = ferme;
    }

    public List<Ferme> getListe() {
        return liste;
    }

    public void setListe(List<Ferme> liste) {
        this.liste = liste;
    }

    // The loadFermes method called in the Event Listener
    public void loadFermes() {
        liste = loginBean.getUtilisateurDao().lister(loginBean.getUser());
    }

    public void addFerme() {
        ferme.setUtilisateur(loginBean.getUser());
        loginBean.getUtilisateurDao().creerFerme(ferme);
    }

    // This is the delete method called in the view
    public void deleteFerme(Ferme ferme) {
        loginBean.getUtilisateurDao().supprimerFerme(ferme);
    }


    public void findFerme() {
        this.ferme = loginBean.getUtilisateurDao().findFermeById(this.ferme.getId_ferme());
    }

    public String edit() {
        ferme.setUtilisateur(loginBean.getUser());
        loginBean.getUtilisateurDao().modifierFerme(this.ferme);
        return "profile.xhtml?faces-redirect=true";

    }

    @PostConstruct
    public void init() {
        liste = new ArrayList<Ferme>();
        ferme = new Ferme();
    }

}

УтилизаторДао:

...
...
// The delete method in the Dao is working fine
public void supprimerFerme(Ferme ferme) {
        try {
            Query query = em.createQuery( "DELETE FROM Ferme u WHERE u.id_ferme = :fermeid and u.utilisateur = :user", Ferme.class );
            query.setParameter("fermeid", ferme.getId_ferme());
            query.setParameter("user", ferme.getUtilisateur());
            query.executeUpdate();

        } catch ( Exception e ) {
            throw new DAOException( e );
        }
    }
..
..
..

person dwix    schedule 07.10.2015    source источник
comment
Какая реализация/версия JSF? (учитывая, что вы используете JSF 2.2, вместо этого вы также можете использовать <f:viewAction onPostback="true">)   -  person BalusC    schedule 08.10.2015
comment
@BalusC Я использую MyFaces, и viewAction тоже не работает, метод удаления вообще не вызывается, я понятия не имею, почему, я разместил весь соответствующий код, пожалуйста, если у вас есть идеи, дайте мне знать.   -  person dwix    schedule 08.10.2015
comment
PS: Любая ‹h:commandButton›, которую я поместил внутрь ‹h:column› в ‹h:datatable›, не может вызвать какой-либо метод, но если я помещу кнопку вне тегов столбцов и только внутри ‹ h:datatable›, поэтому создается только одна кнопка, а не много из-за цикла, поэтому в этом случае только она может вызывать любой метод.   -  person dwix    schedule 08.10.2015
comment
Какая реализация/версия JSF? Если вы даже не можете этого сказать, я подозреваю загрязнение пути к классам несколькими библиотеками JSF с разными версиями.   -  person BalusC    schedule 08.10.2015
comment
@BalusC Спасибо за ваш ответ, я еще раз проверил, вот полная информация: пакет javax.faces.context, JavaServer Faces, версия 2.2 // Mojarra // 2.2.7 // Oracle America, Inc. и я прочитал, что commandButtons не работают внутри таблиц данных, если мой bean-компонент является requestScoped, действительно ли это все еще причина? потому что я получил информацию из некоторых очень старых тем.   -  person dwix    schedule 08.10.2015
comment
Зависит от модели и логики. См. также stackoverflow.com/a/2120183 пункт 4.   -  person BalusC    schedule 08.10.2015
comment
@BalusC, я поместил метод loadFermes() в PostConstruct, теперь delete() работает, но мне нужно обновить страницу вручную, чтобы увидеть изменения, то же самое произошло с методом add(). Поэтому я изменил методы с void на String и вернул --return "profile.xhtml?faces-redirect=true"; теперь все работает, если у вас есть какие-либо другие советы по поводу внесенных мной изменений, пожалуйста, дайте мне знать, большое спасибо!   -  person dwix    schedule 08.10.2015