I'm using JSR356 web sockets and want to add some functions and values to my Server End Point class instead of creating another ManagedBean.
Also i'd like to keep bean properties between requests, so i annotated my Server End Point with annotation @ViewScoped
. And now it looks like this:
@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
}
On my view xhtml
I'm trying to update property language
using 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>
At first when ajax invokes method filterByLanguage
, then value is set to field language
, but after, when I invoke method annotated with @OnOpen
through javascript
then language
is null. I thought that viewsocoped should keep state between requests. Could anyone explain such behavior? Thanks in advance!