我正在开发一个实时应用程序。我有websockets和应用程序范围的托管bean。我正在尝试从websocket访问应用程序范围的托管bean,但我不能。这可能吗?
这是我的websocket和托管bean(应用程序作用域):
@ServerEndpoint("/mediador")
@ManagedBean(eager = true)
@ApplicationScoped
public class Mediador implements Serializable {
@ManagedProperty(value = "#{aplicacion}")
private Aplicacion aplicacion;
...
我的“Aplicacion”托管bean:
@ManagedBean(eager = true)
@ApplicationScoped
public class Aplicacion implements Serializable {
...
如果我尝试在Mediador类中访问de managed property“aplicacion”,那么它为null,因此我得到一个NullPointerException。
由于
答案 0 :(得分:3)
这真的不对。
@ServerEndpoint("/mediador")
@ManagedBean(eager = true)
@ApplicationScoped
public class Mediador implements Serializable {
WS(JSR-356 WebSocket)API和JSF API完全相互独立。他们彼此一无所知,并且不会考虑彼此的混合注释。
实际上,您最终会得到该类的两个实例。一个是ws://.../mediador
提供的WS托管服务器端点,另一个是#{mediador}
提供的JSF托管bean。 @ManagedProperty
只能由JSF托管bean工具识别,并且只能在JSF托管bean实例中工作。
改用CDI。它适用于整个Java EE Web应用程序。不仅在WebSocket端点中,而且在JSF托管bean,WebServlet,WebFilters,WebListeners,JAX-RS资源,JAX-WS资源等中。最终,JSF托管bean工具将被弃用,转而支持CDI。这将在Java EE 9中发生,或者可能已经发生在8。
@ServerEndpoint("/mediador")
public class Mediador { // Shouldn't be serializable!
@Inject
private Aplicacion aplicacion;
// ... (no getter+setter needed!)
}
@Named
@ApplicationScoped // javax.enterprise.context
public class Aplicacion { // Shouldn't be serializable!
// ...
}
无关具体问题:正确地在JSF中实现websockets并不是一件容易的事情,当然,如果您想考虑JSF会话和查看范围,并且希望是能够在推送期间定位特定用户。您最好查看现有的推送组件。另请参阅How can server push asynchronous changes to a HTML page created by JSF?