Ele*_*ena 6 jsf nullpointerexception runnable facescontext
我试图FacesContext
通过调用类FacesContext.getCurrentInstance()
的run()
方法来获取Runnable
,但它返回null
.
public class Task implements Runnable {
@Override
public void run() {
FacesContext context = FacesContext.getCurrentInstance(); // null!
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
这是怎么造成的,我该如何解决?
Bal*_*usC 13
将FacesContext
被存储为ThreadLocal
在线程负责哪些调用的HTTP请求变量FacesServlet
,所述一个负责创建FacesContext
.该线程通常仅通过JSF托管bean方法.在该FacesContext
线程生成的其他线程中不可用.
实际上你应该也不需要在其他线程中使用它.此外,当您的线程启动并独立运行时,底层HTTP请求将立即继续处理HTTP响应然后消失.无论如何,您将无法使用HTTP响应执行某些操作.
您需要以不同方式解决您的问题.问问自己:你需要什么?获取一些信息?只是通过该信息到Runnable
其施工期间代替.
以下示例假定您要访问线程中的某个会话作用域对象.
public class Task implements Runnable {
private Work work;
public Task(Work work) {
this.work = work;
}
@Override
public void run() {
// Just use work.
}
}
Run Code Online (Sandbox Code Playgroud)
Work work = (Work) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("work");
Task task = new Task(work);
// ...
Run Code Online (Sandbox Code Playgroud)
但是,如果你最终需要通知客户端,例如线程的工作已经完成,那么你应该寻找一个不同的解决方案,例如添加一个face消息左右.答案是使用"推".这可以通过SSE或websockets实现.在这个相关问题中可以找到具体的websockets示例:使用JSF/Java EE从数据库进行实时更新.如果您碰巧使用PrimeFaces,请查看
<p:push>
.如果您碰巧使用OmniFaces,请查看<o:socket>
.
与具体问题无关,手动创建Runnable
s并在Java EE Web应用程序中手动生成线程令人震惊.前往以下问答语言,了解所有警告以及如何实际完成:
归档时间: |
|
查看次数: |
7080 次 |
最近记录: |