2010-04-22 2 views
0

У меня есть рекомендация поместить все данные в файл beforePhase для данной страницы, однако теперь, когда я делаю более глубокий анализ, кажется, что некоторые методы getter вызывают до того, как beforePhase уволена.Методы получения JSF, называемые до начала пожара.

Это стало очень очевидным, когда я добавил поддержку параметра url, и я получал NPE на объектах, инициализированных в вызове beforePhase.

Любые мысли? Что-то я сделал неправильно.

У меня есть это в моей странице JSP:

<f:view beforePhase="#{someController.beforePhaseSummary}"> 

Это только пятая строка в файле JSP и сразу после библиотеки тегов.

Вот код, который находится в методе beforePhaseSummary:

public void beforePhaseSummary(PhaseEvent event) { 
    logger.debug("Fired Before Phase Summary: " + event.getPhaseId()); 
    if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) { 
     HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
     if (request.getParameter("application_id") != null) { 
      loadApplication(Long.parseLong(request.getParameter("application_id"))); 
     } 
     /* Do data fetches here */ 
    } 
} 

выход Каротаж выше, указывает, что событие. Запрос сервлета используется для захвата параметров URL. Данные извлекают данные. Тем не менее, выход протоколирования ниже:

2010-04-23 13:44:46,968 [http-8080-4] DEBUG ...SomeController 61 - Get Permit 
2010-04-23 13:44:46,968 [http-8080-4] DEBUG ...SomeController 107 - Getting UnsubmittedCount 
2010-04-23 13:44:46,984 [http-8080-4] DEBUG ...SomeController 61 - Get Permit 
2010-04-23 13:44:47,031 [http-8080-4] DEBUG ...SomeController 133 - Fired Before Phase Summary: RENDER_RESPONSE(6) 

Журналы показывают 2 вызовы метода getPermit и один getUnsubmittedCount до beforePhase увольняют.

+1

Какое функциональное требование? Почему дофаз, а не конструктор или постконструкция? О каких геттерах вы говорите? Почему они вызываются? Есть ли у вас хорошее понимание [жизненного цикла JSF] (http://balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html)? – BalusC

+0

Это элемент, который используется на протяжении всей жизни сеанса, хранящего такие вещи, как информация заголовка, а также используется для навигации на хлебной крошке. Это сеанс. Таким образом, если я поместил его в postContruct, то он не будет повторно инициализироваться, когда субъект изменится. В какой-то момент я попросил область запроса и с большой трудностью постоянно ее инициализировал на каждой странице, когда вы перемещались вокруг уровней приложения ниже уровня, который обычно инициализировалась информацией. –

+0

Я хотел бы видеть код метода beforePhaseSummary. – Naganalf

ответ

0

Понял это. Если вы смешиваете JSTL на своей странице, эти методы могут/будут срабатывать до вызова методов JSF. Я такие методы, как:

<c:if test="${someController.logic == true}"> 
    <p>Some Text</p> 
</c:if> 

Вызов someController.logic стреляла перед вызовом someController.beforePhase.

я заменил выше

<h:outputText rendered="#{someController.logic == true}"> 
    <p>Some Text</p> 
</h:outputText> 

Теперь вещи пожара в правильном порядке. Я также нашел другие страницы в моем приложении, которые имели странные результаты при смешивании JSTL с JSF. Таким образом, я сейчас в процессе изгнания JSTL из приложения.

+0

Связано: [JSTL в JSF2 Facelets ... имеет смысл?] (Http://stackoverflow.com/q/3342984/1065197). В следующий раз было бы лучше объяснить, где возникает ваша проблема. –

Смежные вопросы