JSF - Может ли метод установки блока @PostConstruct с помощью вызова ajax? - PullRequest
2 голосов
/ 27 ноября 2010

Думаю, вопрос понятен по названию.Это мой настоящий bean-компонент:

@ManagedBean(name="selector")
@RequestScoped
public class Selector {
    private String profilePage;

    @PostConstruct
    public void init() {
        System.out.println("I'm PostConstruct");
        if(profilePage==null || profilePage.trim().isEmpty()) {
            this.profilePage="main";
        }
    }

    public String getProfilePage() { 
        return profilePage;
    }

    public void setProfilePage(String profilePage) { 
        this.profilePage=profilePage;
        System.out.println("I'm setProfilePage");
    }
}

И я изменяю его значение (profilePage) с помощью вызова ajax:

<h:commandButton value="Some Action">
    <f:setPropertyActionListener target="#{selector.profilePage}" value="some" />
    <f:ajax event="action" render=":profileContent"/>
</h:commandButton>

Я замечаю, что мой вывод на сервере не является последовательностьюI'm PostConstruct с последующим I'm setProfilePage.Иногда I'm setProfilePage полностью отсутствует.

Я читал, что Методы, помеченные аннотацией @PostConstruct, будут вызываться после создания компонента, внедрения любых ресурсов и установки любых управляемых свойств, но до Боб фактически помещается в область действия.

Я хотел бы знать, может ли @PostConstruct вызвать некоторые конфликты с методом установки.

Приветствия

Ответы [ 2 ]

1 голос
/ 27 ноября 2010

Как указывает BalusC, наличие атрибута рендеринга равным false при обратной передаче довольно часто является причиной того, что методы действия не выполняются. Обычно это происходит, когда для такого атрибута по умолчанию установлено значение false, и только позже в жизненном цикле JSF (т. Е. После применения значений запроса) устанавливается значение true.

Значение по умолчанию true (если возможно) или запоминание значения этого атрибута с использованием области просмотра или чего-то вроде тега ToShawk saveState часто решает эту проблему.

Кроме того, я хотел бы отметить, что рядом с PostConstruct AJAX также не должен иметь ничего общего с этой проблемой.

1 голос
/ 27 ноября 2010

Иногда I'm setProfilePage полностью отсутствует.

Это может произойти, когда компонент UICommand не отображается в дереве компонентов на этапе применения значений запроса.и / или обновить фазу значений модели.Т.е. атрибут rendered этого или одного из его родителей оценил false в этот момент.

Наличие @PostConstruct не должно иметь никакого влияния.

...