Почему фаза ответа рендеринга использует старые данные? - PullRequest
0 голосов
/ 20 февраля 2011

У меня есть dataTable, и в каждой строке есть commandButton, который вызывает метод из ManagedBean с текущим идентификатором элемента следующим образом:

<h:commandButton action="#{myBean.doStuff(item.id)}" value="click me"/>

Это работает довольно хорошо, за исключением того, что фаза ответа рендеринга вызывает метод doStuff снова с другим (вероятно, старым?) Идентификатором. Я посмотрел на эту проблему с помощью PhaseListener:

...stuff...
INFO: START PHASE INVOKE_APPLICATION 5
INFO: selecting item with Id: 11
INFO: selected item: new_item
INFO: END PHASE INVOKE_APPLICATION 5
INFO: START PHASE RENDER_RESPONSE 6
INFO: selecting item with Id: 3
INFO: selected item: test1
INFO: END PHASE RENDER_RESPONSE 6
...more stuff...

new_item - это то, что я хочу, а test1 - то, что я получаю.

Так почему метод doStuff вызывается на этапе ответа рендеринга и почему он использует неправильные значения?

редактировать: я использую JSF 2.0

1 Ответ

1 голос
/ 20 февраля 2011

Обычно это не будет проблемой. Например. рассмотрим следующую лицевую сторону:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">

    <h:body>    
        <h:form>

            <h:dataTable value="#{tableBean.items}" var="item">

                <h:column>
                    #{item}                
                </h:column>

                <h:column>
                    <h:commandButton value="click" action="#{tableBean.doAction(item)}" />
                </h:column>

            </h:dataTable>

        </h:form>

    </h:body>
</html>

и следующий компонент:

@ManagedBean
@ViewScoped
public class TableBean {

    private List<String> items;

    @PostConstruct
    public void init() {        
        items = new ArrayList<String>();
        items.add("bar");
        items.add("kaz");
        items.add("foo");        
    }

    public String doAction(String string) {
        System.out.println(string);
        return "";
    }

    public List<String> getItems() {
        return items;
    }    

}

Это не печатает ничего лишнего в фазе ответа рендеринга. Возможно, вам нужно показать больше кода. Вы также можете попытаться абстрагировать вашу проблему от самого необходимого. Если это сработает шаг за шагом, добавьте другой код снова, пока не увидите, что он ломается.

...