我正在开发一个struts2(2.1.8)网络应用程序。我想使用execAndWait拦截器,以便在处理上传文件时显示等待页面。
在解决了线程问题(execAndWait Interceptor not redirecting to success page after waiting)后,我没有访问getText()方法的NPE,我继续遇到一些问题。
如果调试动作执行所有jsp表单变量(包括上传的文件)都没问题(使用调试检查器我可以看到文件路径,contentType,文件名),但文件不在directori中必须是:
C:\apps\apache-tomcat-6.0.39\work\Catalina\localhost\validador\upload_24cd6d23_a0ec_4887_a47c_7af1f5b703d1_00000002.tmp
我也读过这篇文章: Cannot find file source when processing file with execAndWait interceptor of struts-jquery
但是我已经声明了一个自定义拦截器堆栈,包括default-stack:
<interceptors>
<interceptor name="execAndWaitExtended" class="aoc.interceptor.myExecuteAndWaitInterceptor"></interceptor>
<interceptor-stack name="waitStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="execAndWaitExtended" />
</interceptor-stack>
</interceptors>
我的行动声明:
<package name="default" namespace="/" extends="struts-default" >
...
<action name="uploadUpdatePDF" class="aoc.action.signature.UpdatePDFUpload">
<interceptor-ref name="waitStack"/>
<result type="tiles" name="input">tilesDef.validacioUpdatePDF</result>
<result name="wait">pages/wait.jsp</result>
<result type="tiles" name="sucess">tilesDef.validacioUpdatePDFResult</result>
</action>
理解线程问题已解决,上传文件中的文件名或文件路径似乎没问题,我不明白为什么文件实际上没有存储在服务器目录中(并且在添加execAndWait拦截器之前它工作正常)。
有什么建议吗?
答案 0 :(得分:0)
我不确定你的myExecuteAndWaitInterceptor是做什么的,但它需要复制一份文件,以便它可以运行你的行动的后台线程。
在下面的代码中,我假设有一个名为AbstractUploadAction的基类,它实现了上传文件所需的方法(即获取文件和文件名)。
public class CustomExecuteAndWaitInterceptor extends org.apache.struts2.interceptor.ExecuteAndWaitInterceptor {
@Override
protected BackgroundProcess getNewBackgroundProcess(String name, ActionInvocation actionInvocation,
int threadPriority) {
BackgroundProcess bgProcess;
if (actionInvocation.getAction() instanceof AbstractUploadAction) {
AbstractUploadAction uploadAction = (AbstractUploadAction)actionInvocation.getAction();
try {
File origFile = uploadAction.getUpload();
if (origFile != null) {
File altFile = new File(origFile.getParentFile(), origFile.getName() + "-alt.tmp");
FileUtils.copyFile(origFile, altFile);
altFile.deleteOnExit();
uploadAction.setUpload(altFile);
}
} catch (Exception ex) {
throw new RuntimeException("Error copying uploaded file", ex);
}
bgProcess = new UploadBackgroundProcess(name + "BackgroundThread", actionInvocation, threadPriority);
} else {
bgProcess = super.getNewBackgroundProcess(name, actionInvocation, threadPriority);
}
return bgProcess;
}
/**
* Wraps the standard {@link BackgroundProcess} to clean up alternate file created above.
*/
private class UploadBackgroundProcess extends BackgroundProcess {
public UploadBackgroundProcess(String threadName, ActionInvocation invocation, int threadPriority) {
super(threadName, invocation, threadPriority);
}
@Override
protected void afterInvocation() throws Exception {
super.afterInvocation();
FileUtils.deleteQuietly(((AbstractUploadAction)getAction()).getUpload());
}
}
}
当使用执行和等待拦截器时,您通常应该假设除非您复制它或在execAndWait拦截器启动之前注入,否则您可能无法使用任何您可能无法直接使用的资源。