Создание bean-компонента jsf в коде (в данном случае Session Listener) вызывает бесконечный цикл - PullRequest
1 голос
/ 06 апреля 2011

Прежде всего, все сделано в JSF 1.2.Короче говоря, у меня есть этот код:

public class MobileConfigurationToolSessionListener implements HttpSessionListener {

@Override
public void sessionCreated(HttpSessionEvent event) {
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        externalContext.getSessionMap().put("myBean", new MyBean());
    }
...
}

Доступ к бобу осуществляется из контекста JSF как к обычному сессионному бину JSF.

<h:outputText value="#{myBean.textMsg}"/>

В результате получается почти бесконечный цикл, который в конечном итогезаканчивается из-за:

011-04-06 15:47:42,435 WARN  [http-80-1] org.apache.myfaces.shared_impl.renderkit.html.HtmlGridRendererBase PanelGrid GeneralConfigForm:j_id_jsp_1651416019_7:0:GeneralDetailPanel has not enough children. Child count should be a multiple of the columns attribute.
2011-04-06 15:47:42,825 IDT] E 0000000c (org.apache.catalina.connector.CoyoteAdapter#service) An exception or error occurred in the container during the request processing
ava.lang.ArrayIndexOutOfBoundsException

То, чего я пытаюсь достичь, - это создать объект bean самостоятельно (в соответствии с параметрами URL или куки-файлами) в слушателе сеанса и «внедрить» новый компонент вСессия JSF.

Что я делаю не так?

Спасибо!

РЕДАКТИРОВАТЬ - я подумал, что другим решением может быть создание экземпляра myBean каким-либо образомJSF, а затем запустить методы для достижения той же идеи.Я помню статью @BalusC о том, как заставить JSF создавать экземпляр компонента из кода, но я не смог его найти.(Я думаю, @BalusC ответит мне на это, так что спасибо заранее :-))

1 Ответ

2 голосов
/ 06 апреля 2011

У меня есть этот код:

Что касается слушателя, вы не должны заходить туда FacesContext. Присутствие там не гарантируется, поскольку HttpSessionListener не является частью JSF. Если сеанс был создан по запросу, который не включает FacesServlet, FacesContext#getCurrentInstance() вернет null.

Правильный путь будет

event.getSession().setAttribute("myBean", new MyBean());

В результате получается почти бесконечный цикл, который в конце концов заканчивается:

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


То, чего я пытаюсь добиться, - это создать объект bean самостоятельно (в соответствии с параметрами URL или файлами cookie) в слушателе сеанса и «внедрить» новый компонент в сеанс JSF. 1030 *

Что касается функциональных требований, просто объявите область действия bean-компонента и выполните желаемую работу в его конструкторе или @PostConstruct. Всякий раз, когда вы ссылаетесь на него в представлении, его конструктор и @PostConstruct будут выполняться. У вас есть доступ к параметрам запроса и куки только там.

public MyBean() {
    // Constructor.
    Map<String, String> params = externalContext.getRequestParameterMap();
    Map<String, Object> cookies = externalContext.getRequestCookieMap();
    // ...
}

@PostConstruct
public void init() {
    // Or here, if you're dependent on managed properties.
}
...