2013-04-06 2 views
1

В моем веб-приложении JSF2 (mojarra 2.1.20), странное поведение на странице, содержащей компонент с следующий фрагмент кода:h: commandLink f: действие ajax не вызывается, когда страница имеет f: viewParam required = "true"

<h:commandLink ... action="#{cc.attrs.bean.next}"> 
    <f:ajax execute="@this" render=":#{cc.clientId}" /> 
</h:commandLink> 

действие next() не всегда называется. Я обнаружил, что проблема связана по какой-либо причине идентификатора параметра URL:

<f:metadata> 
    <f:viewParam name="id" value="#{torneoBean.idParam}" required="true" /> 
</f:metadata> 

Когда я вставляю viewParam выше проблема возникает. Но я не могу избавиться от него. Отладка запроса ajax кажется, что запуск, успех, полная последовательность событий вызывается (нет ошибок), компоненты для рендеринга правильно отображаются, но действие не запускается. Есть ли способ отладить эту ситуацию и выяснить, что является основной причиной проблемы?

ответ

3

По-видимому, вы не приложили <h:message(s)> к <f:viewParam id="torneo_id"> и/или вы не обновляете его при каждом запросе ajax. В противном случае вы бы увидели требуемую ошибку проверки. Конкретная проблема, по существу, охватывает пункт 3 из commandButton/commandLink/ajax action/listener method not invoked or input value not updated.

Что касается причины, то <f:viewParam> выполняется по каждому запросу HTTP-запроса, а также по возврату ajax. Когда отправляется запрос ajax, требуемый параметр запроса больше не присутствует в текущем запросе, и поэтому <f:viewParam> не выполняет требуемую проверку.

Есть несколько решений этой:

  1. Сохранить параметр запроса для последующего запроса по <f:param> в компоненте команды.

    <h:commandLink ...> 
        ... 
        <f:param name="id" value="#{param.id}" /> 
    </h:commandLink> 
    
  2. Обязательные поля обязательны для заполнения только при условии обратной связи. Это работает только в том случае, если страница первоначально открывается запросом GET. Если он, однако, откроется без перенаправления, то он все равно потерпит неудачу.

    <f:viewParam ... required="#{not facesContext.postback}" /> 
    
  3. Заменить <f:viewParam> на одном предоставленной утилиты библиотеки JSF OmniFaces, в <o:viewParam>. Он неявно отключает required="true" на postbacks, чтобы вы продолжали использовать одни и те же атрибуты.

    <o:viewParam ... required="true" /> 
    
+0

Благодаря BalusC! Решение №2 решает мою проблему, но в целом как я могу отлаживать такие проблемы, как этот? h: сообщение наверняка могло бы помочь, но я мог бы использовать фазового прослушивателя, чтобы поймать эту проблему (своего рода детектор неправильного поведения) и все другие вопросы, связанные с не вызванными действиями? – maxqua72

+0

Фазовый прослушиватель, который регистрирует текущую фазу, действительно намекнул бы, что значения модели обновления и вызывать фазы приложения пропускаются. Кроме того, разве вы не заметили, что JSF регистрируются в очереди, но не отображаемые сообщения? По крайней мере, Моджара делает это. В крайнем случае, положив точку останова в 'FacesServlet # service()' и форсирующую форму, нужно также дать много понимания. Чем больше вы занимаетесь, тем лучше вы понимаете жизненный цикл JSF и тем легче обнаруживаете потенциальные проблемы. – BalusC

+0

Странно, что в журнале об ошибках и сообщениях не отображались ошибки или предупреждения. Журнал был чистым, поэтому я попросил отладить его. Это будет определенно полезно для таких обстоятельств, как этот. – maxqua72