【问题标题】:File not saved in temp path using struts2 with execAndWait interceptor使用带有 execAndWait 拦截器的 struts2 文件未保存在临时路径中
【发布时间】:2014-04-18 10:23:01
【问题描述】:

我正在开发一个 struts2 (2.1.8) 网络应用程序。我想使用 execAndWait 拦截器,以便在处理上传的文件时显示等待页面。

解决线程问题 (execAndWait Interceptor not redirecting to success page after waiting) 后,我没有 NPE 访问 getText() 方法,我仍然遇到一些问题。

如果调试操作执行,所有 jsp 表单变量(包括上传的文件)都可以(使用调试检查器,我可以看到文件路径、内容类型、文件名),但文件不在目录中必须是:

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

但我已经声明了一个自定义拦截器堆栈,包括默认堆栈:

<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>

了解 Thread 问题已解决,上传文件的文件名或文件路径似乎可以调试,我不明白为什么文件实际上没有存储在服务器目录中(并且在添加 execAndWait 拦截器之前它工作正常)。

有什么建议吗?

【问题讨论】:

    标签: java struts2 interceptor


    【解决方案1】:

    我不确定您的 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 拦截器启动之前将其注入.

    【讨论】:

    • 感谢您的回复马克!不幸的是为时已晚,我切换了另一个解决方案(更改网络流程)。
    猜你喜欢
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多