gpt4 book ai didi

jsf - FacesContext.getCurrentInstance()在Runnable类中返回null

转载 作者:行者123 更新时间:2023-12-04 13:35:21 26 4
gpt4 key购买 nike

我试图通过在FacesContext类的FacesContext.getCurrentInstance()方法中调用run()来获取Runnable,但它返回null

public class Task implements Runnable {

@Override
public void run() {
FacesContext context = FacesContext.getCurrentInstance(); // null!
// ...
}

}

这是怎么引起的,我该如何解决?

最佳答案

FacesContext 作为 ThreadLocal 变量存储在负责HTTP请求的线程中,该线程调用了FacesServlet,后者负责创建FacesContext。该线程通常仅通过JSF托管bean方法。 FacesContext在该线程产生的其他线程中不可用。

实际上,您还应该在其他线程中也不需要它。此外,当线程启动并独立运行时,基础HTTP请求将立即继续处理HTTP响应,然后消失。无论如何,您将无法对HTTP响应进行任何操作。

您需要以不同的方式解决您的问题。问问自己:您需要它做什么?要获取一些信息?只需在构造过程中将该信息传递给Runnable即可。

下面的示例假定您要访问线程中的某些 session 作用域对象。

public class Task implements Runnable {

private Work work;

public Task(Work work) {
this.work = work;
}

@Override
public void run() {
// Just use work.
}

}
Work work = (Work) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("work");
Task task = new Task(work);
// ...

但是,如果最终您需要通知客户,例如线程的工作已经完成,那么您应该寻找一个不同于例如的解决方案。添加面部表情信息左右。答案是使用“推”。这可以通过SSE或websockets实现。一个具体的websockets示例可以在以下相关问题中找到: Real time updates from database using JSF/Java EE。如果您碰巧使用了PrimeFaces,请查看
<p:push> 。如果您碰巧使用OmniFaces,请查看 <o:socket>

与具体问题无关的,在Java EE Web应用程序中手动创建 Runnable并手动生成线程是令人震惊的。前往以下问答,了解所有警告和实际操作方法:
  • Spawning threads in a JSF managed bean for scheduled tasks using a timer
  • Is it safe to start a new thread in a JSF managed bean?
  • 关于jsf - FacesContext.getCurrentInstance()在Runnable类中返回null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2803160/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com