ManagedBean создан, но не должен? - PullRequest
0 голосов
/ 05 ноября 2011

Я работаю над корпоративным приложением, использующим JSF 2.0, с Netbeans 7.0 и Glassfish 3.1 У меня есть управляемый компонент, который является ViewScoped. это объявление класса:

@ManagedBean(name = "myBean")
@ViewScoped
public class MyMBean implements Serializable {

Внутри @PostConstruct он имеет следующее:

String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");    
if (id == null) {
    try {
        FacesContext.getCurrentInstance().getExternalContext().redirect("home.xhtml");
        FacesContext.getCurrentInstance().responseComplete();
    } catch (Exception e) { }
    return;
}

если я перехожу на страницу, которая использует этот управляемый компонент, и идентификатор равен нулю, все работает нормально, и меня перенаправляют на домашнюю страницу. Проблема состоит в том, что когда я перехожу на другую страницу, которая НЕ использует этот управляемый компонент (скажем, например, «otherpage.xhtml»), выполняется метод PostConstruct, и он не должен! И это становится еще хуже: поскольку URL этой другой страницы не имеет параметра "id", бин пытается перенаправить на домашнюю страницу; и я получаю исключение IllegalStateException.

Есть ли какие-либо идеи о том, почему создается управляемый компонент с видовой областью при переходе на страницу, которая его не использует?

Edit: Если для перехода к «otherpage.xhtml» я использую командную ссылку в «home.xhtml», создается 6 дополнительных бинов. Но, если вместо использования ссылки я наберу URL в браузере; это работает отлично. Никакой дополнительный боб не создан. Может быть, что-то не так в том, как я реализовал ссылку. Это код:

<h:form>
    <h:commandLink value="Go to other page" action="otherPage" />
</h:form>

И это правило навигации вface-config:

 <navigation-rule>
        <from-view-id>*</from-view-id>
        <navigation-case>
            <from-outcome>otherPage</from-outcome>
            <to-view-id>/views/otherPage.xhtml</to-view-id>
            <redirect/>
        </navigation-case>
</navigation-rule>

Что-то там не так?

Спасибо! Damian

1 Ответ

0 голосов
/ 05 ноября 2011

У вас наверняка есть #{myBean} где-то в представлении или один из его шаблонов / include / tag / составных файлов, или @ManagedProperty bean-компонентов, на которые ссылается представление.Установка точки останова в конструкторе (post) и исследование трассировки стека должно дать достаточно информации о том, кто / что вызвало конструкцию бина.


Не связано с конкретной проблемой, ExternalContext#redirect() уже неявно звонит FacesContext#responseComplete(), вам не нужно звонить самому.См. Также javadoc .

.
1013 метода Обновление : <h:commandLink> отправляет свой родительский POST <form> на текущую страницу (и, таким образом, создает все связанные bean-компоненты!), а затем, в зависимости от результата навигации, он перенаправляет / перенаправляет на страницу результатов.Вы не должны использовать commandlinks / commandbuttons для простой постраничной навигации.Вместо этого используйте <h:link>. <h:link value="Go to other page" outcome="views/otherPage" /> В конечном итоге вы также можете избавиться от этого <navigation-case>.Если вы действительно настаиваете на сохранении этого варианта навигации, тогда используйте outcome="otherPage". См. Также: Когда я должен использовать h: outputLink вместо h: commandLink? Связь в JSF 2.0 - неявная навигация
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...