Carga de archivos con Spring WebFlow 2.4.0, parámetro no enlazado

Estoy usando Spring Framework 4.1.5, Spring Security 4.0.0.RC2, Spring Webflow 2.4.0.RELEASE y Tomcat 8.0.15.

Seguí el ejemplo en el flujo webdocumentación, pero no puedo obtener el archivo en mi formulario bean.

La forma

    <form:form action="${flowExecutionUrl}" method="post" commandName="fileForm" enctype="multipart/form-data">
        <form:input type="file" value="" path="multipartFileUpload"/>
        <button type="submit" name="_eventId_forward"><spring:message code="signup.forward"/></button>
        <sec:csrfInput/>
    </form:form>

El frijol de forma

public class FileForm implements Serializable {
    private static final long serialVersionUID = 1L;

    private transient MultipartFile multipartFileUpload;

    public MultipartFile getMultipartFileUpload() {
        return multipartFileUpload;
    }

    public void setMultipartFileUpload(final MultipartFile multipartFileUpload) {
        this.multipartFileUpload = multipartFileUpload;
    }
}

El flujo

<view-state id="companyLogo" view="signup/company-logo" model="fileForm">
    <var name="fileForm" class="it.openex.pmcommonw.form.FileForm"/>
    <transition on="back" to="chooseProfile" bind="false" validate="false"/>
    <transition on="forward" to="companyInfo">
        <evaluate expression="userCommonBean.uploadImage(fileForm)"/>
    </transition>
</view-state>

El objeto de respaldo

@Component
public class UserCommonBean {    
    public static void uploadImage(final FileForm fileForm) throws IOException, ServletException {
        fileForm.getMultipartFileUpload(); // always null!!!
    }
}

El multipartResolver

@Bean
public CommonsMultipartResolver filterMultipartResolver() {
    final CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
    multipartResolver.setMaxUploadSize(10 * 1024 * 1024);
    multipartResolver.setMaxInMemorySize(1048576);
    multipartResolver.setDefaultEncoding("UTF-8");
    return multipartResolver;
}

configuración de flujo web

@Configuration
public class WebFlowConfig extends AbstractFlowConfiguration {

    @Autowired
    TilesViewResolver viewResolver;

    @Bean
    public FlowDefinitionRegistry flowRegistry() {
        return getFlowDefinitionRegistryBuilder()
            .setFlowBuilderServices(flowBuilderServices())
            .setBasePath("/WEB-INF/flows/")
            .addFlowLocation("signup.xml", UrlMap.SIGNUP_WEBFLOW)
            .addFlowLocation("user-edit.xml", UrlMap.PROFILE_EDIT_WEBFLOW)
            .build();
    }

    @Bean
    public FlowExecutor flowExecutor() {
        return getFlowExecutorBuilder(flowRegistry()).build();
    }

    @Bean
    public FlowHandlerAdapter flowHandlerAdapter() {
        final FlowHandlerAdapter flowHandlerAdapter = new FlowHandlerAdapter();
        flowHandlerAdapter.setFlowExecutor(flowExecutor());
        return flowHandlerAdapter;
    }

    @Bean
    public FlowHandlerMapping flowHandlerMapping() {
        final FlowHandlerMapping flowHandlerMapping = new FlowHandlerMapping();
        flowHandlerMapping.setFlowRegistry(flowRegistry());
        // this has to be less than -1
        flowHandlerMapping.setOrder(-2);
        return flowHandlerMapping;
    }

    @Bean
    public MvcViewFactoryCreator mvcViewFactoryCreator() {
        final MvcViewFactoryCreator mvcViewFactoryCreator = new MvcViewFactoryCreator();
        final List<ViewResolver> viewResolvers = Collections.singletonList(viewResolver);
        mvcViewFactoryCreator.setViewResolvers(viewResolvers);
        return mvcViewFactoryCreator;
    }

    @Bean
    public FlowBuilderServices flowBuilderServices() {
        return getFlowBuilderServicesBuilder().setViewFactoryCreator(mvcViewFactoryCreator())
            .setValidator(localValidatorFactoryBean()).build();
    }

    @Bean
    public LocalValidatorFactoryBean localValidatorFactoryBean() {
        return new LocalValidatorFactoryBean();
    }
}

Dentro de Tomcat'scontext.xml Ya agreguéallowCasualMultipartParsing="true"

Al depurar la aplicación, puedo ver los datos del archivo dentro de la solicitud y puedo obtenerla si intento publicar el formulario en un controlador normal.

Intenté también eliminar Spring Security, pero aún así no funcionó dentro de Spring WebFlow.

En el objeto requestParameters solo hay 3 objetos:

ejecución_eventid_forward_csrf

Hay algunas filas relevantes en los registros.

DEBUG 2015-03-13 18:03:15,053: org.springframework.web.multipart.support.MultipartFilter - Using MultipartResolver 'filterMultipartResolver' for MultipartFilter
DEBUG 2015-03-13 18:03:15,053: org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'filterMultipartResolver'
DEBUG 2015-03-13 18:03:15,053: org.springframework.web.multipart.support.MultipartFilter - Resolving multipart request [/registrazione] with MultipartFilter
DEBUG 2015-03-13 18:03:15,060: org.springframework.web.multipart.commons.CommonsMultipartResolver - Found multipart file [multipartFileUpload] of size 469217 bytes with original filename [PoliziaMunicipale.png], stored in memory
....
DEBUG 2015-03-13 18:03:15,072: org.springframework.binding.mapping.impl.DefaultMapper - Beginning mapping between source [org.springframework.webflow.core.collection.LocalParameterMap] and target [it.openex.pmcommonw.form.FileForm]
DEBUG 2015-03-13 18:03:15,072: org.springframework.binding.mapping.impl.DefaultMapping - Adding mapping result [TargetAccessError@34bc31ea mapping = parameter:'execution' -> execution, code = 'propertyNotFound', error = true, errorCause = org.springframework.binding.expression.PropertyNotFoundException: Property not found, originalValue = 'e1s2', mappedValue = [null]]
DEBUG 2015-03-13 18:03:15,072: org.springframework.binding.mapping.impl.DefaultMapper - Completing mapping between source [org.springframework.webflow.core.collection.LocalParameterMap] and target [it.openex.pmcommonw.form.FileForm]; total mappings = 1; total errors = 1

losmultipartFileUpload la propiedad no está vinculada en elFileForm frijol.

No estoy seguro si es útil, pero por dentroorg.springframework.webflow.context.servlet.HttpServletRequestParameterMap en la línea 52

if (request instanceof MultipartHttpServletRequest) {
        // ... process multipart data
    }

no pasa la verificación porque la solicitud es una instancia deorg.springframework.security.web.context.HttpSessionSecurityContextRepository$Servlet3SaveToSessionRequestWrapper

Actualización 1

Puedo confirmar que multipartRequest.getFile ("archivo") también funciona.

No puedo habilitar elorg.springframework.web.multipart.support.MultipartFilter filtro sin embargo.

Si está habilitado, multipartRequest es una instancia deStandardMultipartHttpServletRequest que contiene unServlet3SecurityContextHolderAwareRequestWrapper, envolviendo unServlet3SaveToSessionRequestWrapper, que finalmente contiene un inalcanzableDefaultMultipartHttpServletRequest con el multipartFile que necesito, pero no puedo obtenerlo.

Inhabilitándolo, puedo obtenerlo porque multipartRequest se convirtió en una instancia deDefaultMultipartHttpServletRequest, pero no hay validación de archivos y el límite maxUploadSize deCommonsMultipartResolver No se respeta.

Además, si Tomcat lanza una excepción porque el archivo es demasiado grande para el límite maxPostSize de Tomcat, la excepción es detectada por miCustomAccessDeniedHandler porque su tipo esorg.springframework.security.access.AccessDeniedExceptiony el mensaje de error esInvalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'..

Mirando el objeto de solicitud, puedo ver la excepción original de Tomcatorg.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException. Parece que no hay nada para manejarlo correctamente, pero, como dije, si habilito el MultipartFilter no puedo obtener el archivo.

Respuestas a la pregunta(1)

Su respuesta a la pregunta