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 }