【问题标题】:Getting NullPointer Exception on FileUpload using Struts2 and Ajax使用 Struts2 和 Ajax 在 FileUpload 上获取 NullPointer 异常
【发布时间】:2017-11-27 14:29:53
【问题描述】:

我正在使用 Ajax 实现 Struts2 文件上传;我已经添加了如下的jquery代码

$("#btnUploadAttach").click(function () {
            alert("Uploading your file");
            //stop submit the form, we will post it manually.
            event.preventDefault();

            // Get form
            var form = $('#fileUploadForm')[0];

            // Create an FormData object
            var data = new FormData(form);

            alert("Uploading your file" + data);
            $.ajax({
                type: 'POST',
                enctype: 'multipart/form-data',
                data: data,
                contentType: false,
                processData: false,
                cache: false,
                timeout: 600000,
                url: "/Dashboard/UploadFile.action",
                success: function (data) {
                    alert("file saved successfully");
                }
            });
        });

另外请看下面的JSP代码:

<s:form id="fileUploadForm" enctype="multipart/form-data" method="POST">
                        <div class="col-md-12">
                            <s:label for="CashReqFileUpload">Select Your File:</s:label>
                            </div>
                            <div class="col-md-12">
                                <div class="col-md-4">
                                <s:file name="CashReqFileUpload" id="CashReqFileUpload"/>

                            </div>
                            <div class="col-md-4"><input type="submit" value="Upload Document" id="btnUploadAttach" ></div>
                            <div class="col-md-4">
                                <button id="btnPrint" class="btn btn-success">Print</button>
                            </div>
                        </div>
                    </s:form>

我的动作类如下:

 private File CashReqFileUpload;
private String CashReqFileUploadFileName;
private String CashReqFileUploadContentType;
private String destPath;

public String execute(){
    return SUCCESS;
}

public String uploadFileOnServer() throws IOException {
    destPath = "D:/Temp/";
    System.out.println("CashReqFileUpload File name: " + CashReqFileUpload);
    System.out.println("CashReqFileUploadFileName File name: " + CashReqFileUploadFileName);
    System.out.println("destPath File Name : "+destPath);
    File destFile = new File(destPath, CashReqFileUploadFileName);
    FileUtils.copyFile(CashReqFileUpload, destFile);
    return SUCCESS;
}

public File getCashReqFileUpload() {
    return CashReqFileUpload;
}

public void setCashReqFileUpload(File CashReqFileUpload) {
    this.CashReqFileUpload = CashReqFileUpload;
}

public String getCashReqFileUploadFileName() {
    return CashReqFileUploadFileName;
}

public void setCashReqFileUploadFileName(String CashReqFileUploadFileName) {
    this.CashReqFileUploadFileName = CashReqFileUploadFileName;
}

public String getCashReqFileUploadContentType() {
    return CashReqFileUploadContentType;
}

public void setCashReqFileUploadContentType(String CashReqFileUploadContentType) {
    this.CashReqFileUploadContentType = CashReqFileUploadContentType;
}

我尝试过使用 Serialize(),但它没有运行,我在 https://www.mkyong.com/jquery/jquery-ajax-submit-a-multipart-form/ 上找到了一种使用 Ajax 实现的解决方案。它给了我 NullPointerException 如下:

Severe:   java.lang.NullPointerException
    at java.io.File.<init>(File.java:317)
    at com.ISG.CIA.CTI.operations.UploadFile.uploadFileOnServer(UploadFile.java:35)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at ognl.OgnlRuntime.invokeMethod(OgnlRuntime.java:899)
    at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1544)
    at ognl.ObjectMethodAccessor.callMethod(ObjectMethodAccessor.java:68)
    at com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor.callMethodWithDebugInfo(XWorkMethodAccessor.java:96)
    at com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor.callMethod(XWorkMethodAccessor.java:88)
    at ognl.OgnlRuntime.callMethod(OgnlRuntime.java:1620)
    at ognl.ASTMethod.getValueBody(ASTMethod.java:91)
    at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
    at ognl.SimpleNode.getValue(SimpleNode.java:258)
    at ognl.Ognl.getValue(Ognl.java:470)
    at ognl.Ognl.getValue(Ognl.java:434)
    at com.opensymphony.xwork2.ognl.OgnlUtil$3.execute(OgnlUtil.java:371)
    at com.opensymphony.xwork2.ognl.OgnlUtil.compileAndExecuteMethod(OgnlUtil.java:423)
    at com.opensymphony.xwork2.ognl.OgnlUtil.callMethod(OgnlUtil.java:369)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:436)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:252)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:253)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:260)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:52)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.doIntercept(ConversionErrorInterceptor.java:139)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:134)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:134)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:199)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:69)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at org.apache.struts2.interceptor.DateTextFieldInterceptor.intercept(DateTextFieldInterceptor.java:115)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:88)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:246)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:99)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:139

Severe:   hain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
at java.lang.Thread.run(Thread.java:744)

我只想使用 Struts 和 Ajax 实现文件上传。不与任何其他插件一起使用。我在 StackOverflow 上搜索过,但他们的解决方案不是我的要求。

编辑

上传 Struts.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
<constant name = "struts.devMode" value = "true" />
<constant name="struts.ui.theme" value="simple"/>
<constant name="struts.custom.i18n.resources" value="operationProp.OperationalProp" />
<package name = "CTI" extends = "struts-default">
    <interceptors>
        <interceptor-stack name="modelParamsPrepareParamsStack">
            <interceptor-ref name="exception"/>
            <interceptor-ref name="alias"/>
            <interceptor-ref name="i18n"/>
            <interceptor-ref name="checkbox"/>
            <interceptor-ref name="multiselect"/>
            <interceptor-ref name="modelDriven"/>
            <interceptor-ref name="params">
                <param name="excludeParams">^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</param>
            </interceptor-ref>
            <interceptor-ref name="servletConfig"/>
            <interceptor-ref name="prepare"/>
            <interceptor-ref name="chain"/>
            <interceptor-ref name="fileUpload"/>
            <interceptor-ref name="staticParams"/>
            <interceptor-ref name="actionMappingParams"/>
            <interceptor-ref name="params">
                <param name="excludeParams">^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</param>
            </interceptor-ref>
            <interceptor-ref name="conversionError"/>
            <interceptor-ref name="validation">
                <param name="excludeMethods">input,back,cancel,browse</param>
            </interceptor-ref>
            <interceptor-ref name="workflow">
                <param name="excludeMethods">input,back,cancel,browse</param>
            </interceptor-ref>
        </interceptor-stack>
    </interceptors>
    <action name = "OnLoadAction" 
            class = "com.ISG.CIA.CTI.CashRequestManagement" 
            method = "execute">
        <result name = "success">/ApprovedHistory.jsp</result>
    </action>
    <action name = "OnClickOfCreateNewReq" 
            class = "com.ISG.CIA.CTI.CashRequestManagement" 
            method = "getCashReqDataForNewReq">
        <result name = "success">/CashRequestForm.jsp</result>
    </action>
    <action name = "onLoadForm" 
            class = "com.ISG.CIA.CTI.CashRequestManagement" 
            method = "getCashReqDataForSavedRequest">
        <result name = "success">/CashRequestForm.jsp</result>
    </action>
    <action name = "OnClickOfSaveRequest" 
            class = "com.ISG.CIA.CTI.CashRequestManagement" 
            method = "SaveCashRequest">
        <result name = "success">/CashRequestForm.jsp</result>
    </action>
    <action name="CashReqRej" 
            class="com.ISG.CIA.CTI.CashRequestManagement" 
            method="cancelCashReq">
        <result name="success">/CashRequestForm.jsp</result>
    </action>
    <action name="CashReqApprove" 
            class="com.ISG.CIA.CTI.CashRequestManagement" 
            method="approveCashReq">
        <result name="success">/CashRequestForm.jsp</result>
    </action>
    <action name="UploadFile" 
            class="com.ISG.CIA.CTI.operations.UploadFile" 
            method="uploadFileOnServer">
        <interceptor-ref name="modelDriven"/>  
        <interceptor-ref name="defaultStack"/>  
        <interceptor-ref name="fileUpload"/>
        <interceptor-ref name="basicStack"/> 
        <result name="none">/CashRequestForm.jsp</result>
    </action>
</package>

可能是 struts.xml 可能有助于识别问题。

【问题讨论】:

标签: struts2 jquery-file-upload


【解决方案1】:

在其他喜欢之前尝试文件上传拦截器

<action name="UploadFile" 
        class="com.ISG.CIA.CTI.operations.UploadFile" 
        method="uploadFileOnServer">
    <interceptor-ref name="fileUpload"/>
    <interceptor-ref name="modelDriven"/>  
    <interceptor-ref name="defaultStack"/>  
    <interceptor-ref name="basicStack"/> 
    <result name="none">/CashRequestForm.jsp</result>
</action>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多