Я использую веб-сокеты JSR356 и хочу добавить некоторые функции и значения в класс конечной точки сервера вместо создания еще одного ManagedBean.
Также я хотел бы сохранить свойства bean-компонента между запросами, поэтому я аннотировал свою конечную точку сервера аннотацией @ViewScoped
. И теперь это выглядит так:
@Named
@ViewScoped
@ServerEndpoint(value = "/session", encoders = ChatMessageEncoder.class, decoders = ChatMessageDecoder.class)
public class ChatEndpoint implements Serializable {
@EJB
private LanguageHelper languageHelper;
private String language;
public void filterByLanguage() {
if (language == null)
language = "US";
}
@OnOpen
public void open(final Session session) throws IOException, EncodeException {
// ...
}
@OnMessage
public void onMessage(final Session session, final ChatMessage chatMessage) {
// ...
}
@OnClose
public void onClose(Session session) throws IOException {
// ...
}
// getters & setters
}
На моем view xhtml
я пытаюсь обновить свойство language
с помощью ajax.
<h:form>
<h:outputLabel value="Select languages you want to practice" for="languages"/>
<h:selectOneMenu value="#{chatEndpoint.language}">
<f:selectItems value="#{chatEndpoint.languageHelper.languages}" var="l"
itemLabel="#{l.language}" itemValue="#{l.code}"/>
<f:ajax event="change" listener="#{chatEndpoint.filterByLanguage}" render="@form" execute="@this"/>
</h:selectOneMenu>
</h:form>
Сначала, когда ajax вызывает метод filterByLanguage
, значение устанавливается в поле language
, но после, когда я вызываю метод, аннотированный с @OnOpen
по javascript
, тогда language
равно нулю. Я думал, что viewsocoped должен сохранять состояние между запросами. Кто-нибудь может объяснить такое поведение? Заранее спасибо!