You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Sergey Beryozkin (JIRA)" <ji...@apache.org> on 2015/01/15 13:50:34 UTC

[jira] [Commented] (CXF-6194) [multipart] Server handle Collection argument as single element

    [ https://issues.apache.org/jira/browse/CXF-6194?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14278641#comment-14278641 ] 

Sergey Beryozkin commented on CXF-6194:
---------------------------------------

MultipartProvider accumulates multiple parts with the same name into a collection. The concrete use case arose few years back when a browser was submitting multiple files, typically one should have a 'files' part with multiple file parts embedded inside of that single 'files' part:

http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.2

(see the last example).

However what was happening was that a browser was sending multiple 'files' part, one per each file. Therefore, by default, if a given part is expect to be read into a Collection then all the parts with a given name will be found and then read and added into a collection allocated by the provider.

I've added a property, "single.multipart.is.collection", that can be set in jaxrs:properties. That will read the content of the individual part to the explicit collection, if applicable
 

> [multipart] Server handle Collection argument as single element
> ---------------------------------------------------------------
>
>                 Key: CXF-6194
>                 URL: https://issues.apache.org/jira/browse/CXF-6194
>             Project: CXF
>          Issue Type: Bug
>          Components: JAX-RS
>    Affects Versions: 3.0.3
>            Reporter: Alexey Markevich
>
> @POST
> @Path("/model")
> @Consumes(MediaType.MULTIPART_FORM_DATA)
> void importModels(@Multipart(value = "workspace") String workspace,
>             @Multipart(value = "content", type = MediaType.APPLICATION_JSON) Collection<Model> content)
> Server error [1].
> JacksonJsonProvider called with following isReadable args:
> 1
> type=java.util.Collection
> genericType=java.util.Collection<Model>
> mediaType=multipart/form-data;boundary="uuid:af1d3363-4fc9-408b-b5d3-c352c7f33a49"
> 2
> INFO: type=Model
> INFO: genericType=Model
> INFO: mediaType=application/json
> 1.
> Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of org.talend.ipaas.web.common.bean.Flow out of START_ARRAY token
>  at [Source: [{...}]; line: 1, column: 1]
> 	at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
> 	at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:749)
> 	at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:745)
> 	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromArray(BeanDeserializerBase.java:1210)
> 	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:151)
> 	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:126)
> 	at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1232)
> 	at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:676)
> 	at com.fasterxml.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:800)
> 	at org.apache.cxf.jaxrs.provider.MultipartProvider.fromAttachment(MultipartProvider.java:238)
> 	at org.apache.cxf.jaxrs.provider.MultipartProvider.getAttachmentCollection(MultipartProvider.java:203)
> 	at org.apache.cxf.jaxrs.provider.MultipartProvider.readFrom(MultipartProvider.java:175)
> 	at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1325)
> 	at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1276)
> 	at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:812)
> 	at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:775)
> 	at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:212)
> 	... 32 more



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)