Struts2 ExecAndWait NullPointerException

问题描述 投票:0回答:1

我在ExecuAndWait使用过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)

来源片段:

行动类:

public String createSite() throws Exception
    {
        ----

        HttpServletRequest request = ServletActionContext.getRequest();
        request.setAttribute("test", "test"); {At this line I got error}
        ---
    }

来自ExecuteAndWaitInterceptor.java

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            }

来自BackgroundProcess.java

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     }

Struts2 ExecuteAndWait的概念每当有一个长时间运行的请求时,它将在separate thread中执行并返回结果返回WAIT,所以客户端再次在某个时间间隔内重新提交相同的请求以了解其进程的状态(在线程中运行)

我的问题:在上面的情况下,主要请求(启动线程调用操作)返回WAIT并且其他请求在我的动作类中此时再次知道动作状态我有request.setAttribute("test", "test");,在这一行它抛出一个错误,我上面提到过。

java multithreading apache struts2
1个回答
0
投票

我有一个类似的问题与execAndWait拦截器投掷NPE。你可以在这里找到我的案例研究:execAndWait interceptor not working with validation关于我如何解决这个问题。在这个问题我发现的是,execAndWait在单独的线程中运行并且继续投掷wait直到行动完成并且平均时间它自行循环。我遇到了这个问题,因为我使用了model driven拦截器。由于模型驱动的拦截器的getModel()execAndWait拦截器反复调用。在getModel方法中,它是从头开始一次又一次地设置新的POJO对象。

然后它进入validate方法进行验证。在验证过程中,它发现其中一个POJO字段为null。显然,这是因为在getModel中重新创建了原始的新POJO对象。因此扔了Null Pointer Exception

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

我希望你能找到一种方法。

© www.soinside.com 2019 - 2024. All rights reserved.