flow icon indicating copy to clipboard operation
flow copied to clipboard

When CommonsMultipartResolver is registered, streamingFinished is never called.

Open F43nd1r opened this issue 3 years ago • 2 comments

Description of the bug

Upload success listeners are never called if a CommonsMultipartResolver is registered as MultipartResolver

Minimal reproducible example

@Configuration
class RestConfiguration {
    @Bean
    fun multipartResolver(): MultipartResolver = CommonsMultipartResolver()
}
val buffer = MemoryBuffer()
val upload = Upload(buffer)
upload.addSucceededListener { Notification.show(StreamUtils.copyToString(buffer.inputStream, Charset.defaultCharset())) }
div.add(upload)

Expected behavior

Notification shows after file upload

Actual behavior

Listener is never called

Versions:

- Vaadin / Flow version: 19.0.5
- Java version: 15
- OS version: Linux
- Application Server (if applicable): Spring Boot

Workaround

I need CommonsMultipartResolver in other parts of my application, so I can't just switch to StandardServletMultipartResolver. Workaround is to conditionally select the one that works:

class SwitchingMultipartResolver : MultipartResolver {
    private val commonsResolver = CommonsMultipartResolver()
    private val standardResolver = StandardServletMultipartResolver()
    override fun isMultipart(request: HttpServletRequest): Boolean = request.resolver().isMultipart(request)

    override fun resolveMultipart(request: HttpServletRequest): MultipartHttpServletRequest = request.resolver().resolveMultipart(request)

    override fun cleanupMultipart(request: MultipartHttpServletRequest) = request.resolver().cleanupMultipart(request)

    private fun HttpServletRequest.resolver() = if (servletPath.startsWith("/VAADIN")) standardResolver else commonsResolver
}

Potentially related

https://github.com/vaadin/flow/issues/5924 https://github.com/vaadin/flow/commit/cbf556f579ddeef1918a31085807be89c8a2f352 It seems like previously only CommonsMultipartResolver worked, and now only StandardServletMultipartResolver works for vaadin.

F43nd1r avatar Apr 23 '21 15:04 F43nd1r

Tested with this project upload-problem.zip

If the @Bean annotation in RestConfiguration is commented out, the notification is shown. Otherwise it is not.

When CommonsMultipartResolver is registered, streamingFinished is never called.

tulioag avatar May 17 '21 12:05 tulioag

I understand that we are using something from StandardServletMultipartResolver instead of relying only on the MultipartResolver interface, so it fails when we change the implementation.

I will label it so it can be addressed

miguelatvaadin avatar May 18 '21 07:05 miguelatvaadin