Java Struts2 ExecAndWait NullPointerException

Java Struts2 ExecAndWait NullPointerException,java,multithreading,apache,struts2,Java,Multithreading,Apache,Struts2,我在Struts2 在操作中的请求中设置属性时,我收到错误NPE(这是长期运行的) 下面是堆栈轨迹: java.lang.NullPointerException at org.apache.catalina.connector.Request.notifyAttributeAssigned(Request.java:1563) at org.apache.catalina.connector.Request.setAttribute(Request.java:1554)

我在
Struts2

在操作中的请求中设置属性时,我收到错误
NPE
(这是长期运行的)

下面是堆栈轨迹:

java.lang.NullPointerException
    at org.apache.catalina.connector.Request.notifyAttributeAssigned(Request.java:1563)
    at org.apache.catalina.connector.Request.setAttribute(Request.java:1554)
    at org.apache.catalina.connector.RequestFacade.setAttribute(RequestFacade.java:542)
    at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:239)
    at com.os.gfnactions.SiteAction.createSite(SiteAction.java:1298)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:450)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:289)
    at com.os.interceptor.BackgroundProcess$1.run(BackgroundProcess.java:60)
    at java.lang.Thread.run(Unknown Source)
来源片段:

行动类:

Struts2 ExecuteAndWait的概念 每当有一个长时间运行的请求时,它将在
单独的线程中执行
,并返回
等待
,因此客户端再次在某个时间间隔内重新提交相同的请求,以了解其进程(正在线程中运行)的状态


我的问题:在上述情况下,当主请求(启动线程调用操作)返回WAIT时,另一个请求知道此时在我的操作类中操作的状态时,我有
request.setAttribute(“test”,“test”),在这一行它抛出了一个我上面提到的错误。

我在
execAndWait
拦截器抛出
NPE
时遇到了类似的问题。你可以在这里找到我的案例研究:关于我如何解决这个问题。。在这个问题中,我发现,
execAndWait
在单独的线程中运行,并不断抛出
wait
,直到操作完成,同时它自己循环。我面临这个问题,因为我使用了
模型驱动的
拦截器。由于模型驱动拦截器的
getModel()
execAndWait
拦截器反复调用。在getModel方法中,它从头开始一次又一次地设置新的POJO对象

然后进入
validate
方法进行验证。在验证过程中,它发现其中一个POJO字段为空。显然,这是因为在
getModel
中重新创建了原始的新POJO对象。因此引发了
空指针异常

所以我使用了
SessionAware
接口。并在POJO对象进入
validate
时首次存储该对象。因为
execAndWait
肯定会再次调用所有方法并从头开始重新编写对象。为此,我在
getModel()
方法中检查了该对象的可用性。如果在会话中找到,则返回相同的对象,而不是创建新对象


我希望您能从中找到解决方法。

您想用
setAttribute
实现什么?基于
setAttribute值
,在我的
拦截器中,我已经决定在成功案例中显示的哪个结果而不是请求范围使用会话范围。是的,我已经解决了这个问题,但我想知道这种行为,如果这种行为有效,那么我就不必在整个产品中为长时间运行的操作将请求范围更改为会话。
public String createSite() throws Exception
    {
        ----

        HttpServletRequest request = ServletActionContext.getRequest();
        request.setAttribute("test", "test"); {At this line I got error}
        ---
    }
231            if ((!executeAfterValidationPass || secondTime) && bp == null) {
232                bp = getNewBackgroundProcess(name, actionInvocation, threadPriority);
233                session.put(KEY + name, bp);
234                performInitialDelay(bp); // first time let some time pass before showing wait page
235                secondTime = false;
236            }
public More ...BackgroundProcess(String threadName, final ActionInvocation invocation, int threadPriority) {
50         this.invocation = invocation;
51         this.action = invocation.getAction();
52         try {
53             final Thread t = new Thread(new Runnable() {
54                 public void More ...run() {
55                     try {
56                         beforeInvocation();
57                         result = invocation.invokeActionOnly();
58                         afterInvocation();
59                     } catch (Exception e) {
60                         exception = e;
61                     }
62 
63                     done = true;
64                 }
65             });
66             t.setName(threadName);
67             t.setPriority(threadPriority);
68             t.start();
69         } catch (Exception e) {
70             exception = e;
71         }
72     }