簡體   English   中英

Spring Webflow 2.4.5多部分/表單數據綁定問題

[英]Spring Webflow 2.4.5 multipart/form-data binding problems

我為項目配置了多部分解析器:

@EnableWebMvc
@ComponentScan({"com.dg"})
@Configuration
@SuppressWarnings("deprecation")
public class AppConfig extends AbstractFlowConfiguration {

    @Bean
    public CommonsMultipartResolver fileResolver() {
        CommonsMultipartResolver cr = new CommonsMultipartResolver();
        cr.setDefaultEncoding("UTF-8");
        cr.setMaxUploadSize(26214400);
        return cr;
    }

}

我使用可序列化對象作為模型:

public class NewRequestModel implements Serializable {

    private static final long serialVersionUID = -5372803991673351564L;

    private String entry;

    private transient MultipartFile attachment;

    ... // getters and setters

}

頁面加載后,我將初始化模型:

網絡流量

<var name="requestModel" class="com.dg.model.request.NewRequestModel" />

    <on-start>
        <evaluate expression="newRequestAction.initTestRequest" />
    </on-start>

行動

public Event initTestRequest(RequestContext context) {
        NewRequestModel model = (NewRequestModel)context.getFlowScope().get("requestModel");
        if (model==null) {
            model = new NewRequestModel();
        }
        context.getFlowScope().put("requestModel", model);
        return new Event(this, "DONE");
    }

我在JSP中綁定值:

<form:form id="actionForm" method="POST" modelAttribute="requestModel" enctype="multipart/form-data">

    <div class="panel-heading">
        Test Request
    </div>

    <div class="panel-body">

        <div class="form-group">
            <form:input path="entry" />
        </div>

        <div class="form-group">
            <form:input type="file" path="attachment" />
        </div>

        <div>
            <button type="button" class="btn btn-primary" onclick="app.submitEvent({formSelector: '#actionForm',event: 'submitAndValidate'});">
                Submit Request
            </button>
        </div>

    </div>

</form:form>

單擊按鈕后,將提交帶有事件“ submitAndValidate”的表單

 <view-state id="start" view="request/test/test-request" model="requestModel">
        <transition on="submitAndValidate" to="submitAndValidate" />
    </view-state>

    <action-state id="submitAndValidate">
        <evaluate expression="newRequestAction.testRequest" />
        <transition to="start" />
    </action-state>

當我調試Action類的testRequest方法時,模型不保留與表單一起提交的值。

public Event testRequest(RequestContext context) {
        NewRequestModel model = (NewRequestModel)context.getFlowScope().get("requestModel");
        String entry= model.getEntry();
        MultipartFile file = model.getAttachment();
        if (entry==null) {
            // is null when enctype is included on form
            // is populated when enctype is not included on form
        } 
        if (file==null) {
            // always null for some reason
        }
        return new Event(this, "DONE");
    }

如果我從表單中刪除enctype =“ multipart / form-data”,則該綁定適用於“ entry”變量。 當然,這將不允許上傳文檔。 因此,我需要能夠在表單上包含enctype。

我已經看完了,查找了答案並閱讀了指南,但我不明白為什么會失敗。 感謝您在查找有問題的配置/代碼方面的幫助。

嘗試向表單添加操作(crsf屬性是可選的):

<form:form action="${flowExecutionUrl}&${_csrf.parameterName}=${_csrf.token}" modelAttribute="requestModel" enctype="multipart/form-data">

並使用簡單的輸入:

<input type="file" name="attachment" id="attachment"/>

和一個簡單的提交:

<input type="submit" id="submitAndValidate" name="_eventId_ submitAndValidate" value="Submit Request">

問題出在我的MultipartResolver bean配置中。 Spring專門在尋找名為“ multipartResolver”的bean。 因此,我有2個解決方案:

選項1-在@Bean批注中指定名稱

@Bean(name="multipartResolver")
public CommonsMultipartResolver fileResolver() {
    CommonsMultipartResolver cr = new CommonsMultipartResolver();
    cr.setDefaultEncoding("UTF-8");
    cr.setMaxUploadSize(26214400);
    return cr;
}

選項2-重命名方法

@Bean 
public CommonsMultipartResolver multipartResolver() {
    CommonsMultipartResolver cr = new CommonsMultipartResolver();
    cr.setDefaultEncoding("UTF-8");
    cr.setMaxUploadSize(26214400);
    return cr;
}

對於大多數人來說,以上更改可能會解決問題。 但是,由於進行上述更改后出現ClassNotFoundException錯誤,因此我還需要向項目中添加Apache Commons IO。

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
</dependency>

完成這些更新后,表單現在可以正確綁定了。 我的問題已解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM