Я работаю над корпоративным приложением, использующим 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