Тайм-аут CDI приводит к NPE

Есть ли способ (в JSF 2) поймать тайм-аут разговора и перенаправить пользователя на новую страницу? Я получаю неприятные исключения NullPointerException, когда время разговора истекает.

Я мог бы перенаправить пользователя на все NPE, но это кажется слишком большой сетью.


person Brian Leathem    schedule 05.06.2010    source источник


Ответы (2)


Это ошибка в Weld 1.0.0 RI для CDI.

https://jira.jboss.org/browse/WELD-550

Это, по-видимому, было исправлено в багажнике Weld, я не знаю, в какой версии это доступно. В транке возникает исключение org.jboss.weld.context.NonexistentConversationException при попытке доступа к беседе с истекшим сроком действия. Это исключение можно перехватить с помощью пользовательского ExceptionHandler и перенаправить пользователя на соответствующую страницу. См. этот блог для получения более подробной информации о создании пользовательского ExceptionHandler:

http://weblogs.java.net/blog/edburns/archive/2009/09/03/dealing-gracefully-viewexpiredexception-jsf2

person Brian Leathem    schedule 10.06.2010
comment
Ого, не знал, что это баг. Я думал, что это я не понимаю Weld ;) С новым поведением я могу удалить некоторые обходные пути в моем коде. Спасибо, что поделился! - person Wolkenarchitekt; 10.06.2010
comment
Вы уже успели обновить Weld до версии в багажнике? если да, есть ли у вас хорошие советы? - person Wolkenarchitekt; 10.06.2010
comment
Я еще не занимался этим... Я опубликую сообщение на форуме Weld, когда сделаю: seamframework.org/Community /CDITimeoutResultsInAnNPE - person Brian Leathem; 11.06.2010
comment
К вашему сведению: в Weld 3.0.1-FINAL (в комплекте с Glassfish 3.0.1) возникает исключение NonexistentConversationException. - person Brian Leathem; 23.06.2010

В настоящее время я также работаю с CDI-разговорами и пытаюсь создать приложение на основе разговоров. Я решил большинство проблем (нелегко без полезного туториала...). Может быть, я могу помочь.

Моя первая проблема заключалась в том, что я не перенаправил представление и не добавил cid в GET при переходе на следующую страницу Conversation-UseCase. Я задал соответствующий вопрос на форуме Weld. Там я узнал, что в моем управляемом/сварном компоненте мне нужно перенаправить на следующую страницу и добавить cid в качестве GET-параметра. Только тогда вы сможете получить доступ к элементам вашего bean-компонента, относящимся к диалогу, на следующей странице.

Итак, когда я вхожу на первую страницу своего разговора, я вызываю метод запуска (например, с помощью commandLink) в моем ConversationScoped-Bean, например:

public String startRegister() {
  if (conversation.isTransient)
    conversation.begin();
  return "register_start?faces-redirect=true&includeViewParams=true&cid=" + conversation.getId()
}

Это решает вашу проблему? Я также задал вопрос в StackOverflow, связанный с ViewExpiredException, которое необходимо обрабатывать при работе с диалогами — здесь.

person Wolkenarchitekt    schedule 09.06.2010
comment
Спасибо за отзыв, но это немного противоположно тому, чего я надеялся достичь. Я хотел использовать <h:link>, чтобы избежать продолжительного разговора. Это должно работать в соответствии со спецификацией, см. ответ, который я опубликовал. - person Brian Leathem; 10.06.2010