Websphere 尝试获取已加载到应用程序中的类时,从workmanager获取NPE

Websphere 尝试获取已加载到应用程序中的类时,从workmanager获取NPE,websphere,workmanagers,Websphere,Workmanagers,我正在使用WebSphere8.5和JSF2.0,使用WorkManager(来自WebSphere-AsyncBean)时遇到问题。我有一个实现工作接口的workManagerExample类。当我从应用程序中调用workManagerExample时,我无法再获取已加载到应用程序中的类的方法情况:我的应用程序中有一个实用程序类(它运行良好),但当一个用户试图从WorkmanagerSample使用它(如Utility.someMethod)时,我得到了一个NPE。在调用“startWork(

我正在使用WebSphere8.5和JSF2.0,使用WorkManager(来自WebSphere-AsyncBean)时遇到问题。我有一个实现工作接口的workManagerExample类。当我从应用程序中调用workManagerExample时,我无法再获取已加载到应用程序中的类的方法情况:我的应用程序中有一个实用程序类(它运行良好),但当一个用户试图从WorkmanagerSample使用它(如Utility.someMethod)时,我得到了一个NPE。在调用“startWork(WorkManagerExample)”之前,我检查了实用程序类,它不为null,我可以像往常一样使用它。顺便说一句,workManager工作正常,没有从我的应用程序调用任何已加载的类。我无法将实用程序类作为workManagerExample构造函数的参数传递(这是客户端/客户的限制)。我的问题是为什么我不再使用这个asynbean中的实用类函数

web.xml
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
//some extra config not related
    <resource-ref>
        <description>WorkManager</description>
        <res-ref-name>wm/default</res-ref-name>
        <res-type>com.ibm.websphere.asynchbeans.WorkManager</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref> 
</web-app>

ibm-web-bnd.xml
<web-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_0.xsd"
version="1.0">
    <virtual-host name="default_host" />
    <resource-ref name="wm/default" binding-name="wm/default" />
</web-bnd>

在GetInfoWork.java中,当我尝试“FacesContext.getCurrentInstance();”时我总是得到NULL,但如果我从Class1.java尝试,它会按预期工作。文件夹结构和JSF2 web应用程序一样,这是一个现有的应用程序,现在我想通过workManager(从com.ibm.ws.runtime.jar)添加这个异步Bean功能。

FacesContext.getCurrentInstance()
不是您的实用程序类,而是JSF框架的内部部分。如果您看一下java文档:

返回当前线程正在处理的请求的FacesContext实例

FacesContext
需要一个线程来处理web请求才能正常工作,异步bean在单独的线程中被调用,而这个线程根本不知道JSF上下文,这就是为什么会出现null。处理web请求的线程将调用您的
Class1

但是,您的陈述不正确:
我无法将实用程序类作为workManagerExample构造函数的参数传递(这是一个限制)

我不知道你在哪里找到这个限制,但不是真的。请参见信息中心-

所以你的代码应该是这样的:

WorkManager workManager = getWorkManager();
if (workManager!=null){ 
  // extract from FacesContext what you need
  ....
  // and pass it to work item  
  GetInfoWork currentOfferWork = new GetInfoWork(pass, whatEver, objectsYouNeed, inWork); //GetInfoWork implements Work
  workManager.startWork(currentOfferWork);  
}
更新
如果不是通过构造函数,您可以通过setter方法传递它。但是不要传递
FacesContext
,而是传递您真正需要的东西,因为在web请求结束后,来自该上下文的一些数据将无效。e、 g:

GetInfoWork currentOfferWork = new GetInfoWork(); //GetInfoWork implements Work
currentOfferWork.setMyParam1(param1);
currentOfferWork.setMyParam2(param2);
workManager.startWork(currentOfferWork);

您需要提供代码示例并更好地描述打包结构,因为目前尚不清楚您的问题所在。@Gas感谢您的回复。我更新了问题。我的意思是“这是来自客户(个人)的限制”。更新中的问题。我一开始试过你的例子,但后来客户给了我这个限制。我应该向他解释那是不可能的吗?Thanks@danRod我不知道整个情况,但从我的角度来看,这是一个非常奇怪的限制。有什么原因吗?我从未使用过这个webSphere功能。。早上我不能问太多关于设计的问题(我在一份文档中得到了关于使用什么和不使用什么的说明)。我想也许我在使用workManager时走错了方向。无法解决问题(有限制),对吗?@danRod看到更新后,可以使用setter方法。我不知道你的要求,所以很难提出不同的解决方案。JavaEE6支持异步servlet,因此您可以创建单独的servlet,并在那里处理异步任务。非常感谢。
WorkManager workManager = getWorkManager();
if (workManager!=null){ 
  // extract from FacesContext what you need
  ....
  // and pass it to work item  
  GetInfoWork currentOfferWork = new GetInfoWork(pass, whatEver, objectsYouNeed, inWork); //GetInfoWork implements Work
  workManager.startWork(currentOfferWork);  
}
GetInfoWork currentOfferWork = new GetInfoWork(); //GetInfoWork implements Work
currentOfferWork.setMyParam1(param1);
currentOfferWork.setMyParam2(param2);
workManager.startWork(currentOfferWork);