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 2010/11/24 19:27:14 UTC
[jira] Resolved: (CXF-3148) CXF converts collections to arrays
during serialization
[ https://issues.apache.org/jira/browse/CXF-3148?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Sergey Beryozkin resolved CXF-3148.
-----------------------------------
Resolution: Fixed
Fix Version/s: 2.4
2.3.1
2.2.12
Assignee: Sergey Beryozkin
Fix has been applied, thanks
> CXF converts collections to arrays during serialization
> -------------------------------------------------------
>
> Key: CXF-3148
> URL: https://issues.apache.org/jira/browse/CXF-3148
> Project: CXF
> Issue Type: Bug
> Components: JAX-RS
> Affects Versions: 2.3.0
> Reporter: Dobes Vandermeer
> Assignee: Sergey Beryozkin
> Fix For: 2.2.12, 2.3.1, 2.4
>
>
> In org.apache.cxf.jaxrs.provider.JAXBElementProvider.marshalCollection(Class<?>, Object, Class<?>, Type, String, OutputStream, MediaType), it converts the resulting collection into an array before serializing it.
> Unfortunately, this prevents us from using a collection that lazily loads its contents from the DB as it goes, since toArray() would require us to create and return all the results immediately.
> Ideally this method would be changed to operate in a manner that is "friendly" to lazy collections, by only using the collection's iterator (once).
> This version iterates over the collection only once, which would be the most efficient for collections that are backed by out of memory storage:
> {code}
> protected void marshalCollection(Class<?> originalCls, Object actualObject, Class<?> actualClass, Type genericType, String encoding,
> OutputStream os, MediaType m) throws Exception {
> Collection c = originalCls.isArray() ? Arrays.asList((Object[]) actualObject) : (Collection) actualObject;
>
> Iterator it = c.iterator();
>
> boolean empty = false == it.hasNext();
> Object firstObj = empty?null:it.next();
> QName qname = null;
> if (firstObj instanceof JAXBElement) {
> JAXBElement el = (JAXBElement) firstObj;
> qname = el.getName();
> actualClass = el.getDeclaredType();
> } else {
> qname = getCollectionWrapperQName(actualClass, genericType, actualObject, true);
> }
> if (qname == null) {
> String message = new org.apache.cxf.common.i18n.Message("NO_COLLECTION_ROOT", BUNDLE).toString();
> throw new WebApplicationException(Response.serverError().entity(message).build());
> }
> String startTag = null;
> String endTag = null;
> if (qname.getNamespaceURI().length() > 0) {
> startTag = "<ns1:" + qname.getLocalPart() + " xmlns:ns1=\"" + qname.getNamespaceURI() + "\">";
> endTag = "</ns1:" + qname.getLocalPart() + ">";
> } else {
> startTag = "<" + qname.getLocalPart() + ">";
> endTag = "</" + qname.getLocalPart() + ">";
> }
> os.write(startTag.getBytes());
> if(!empty) {
> marshalCollectionMember(firstObj instanceof JAXBElement ? ((JAXBElement) firstObj).getValue() : firstObj, actualClass, genericType, encoding, os, m, qname
> .getNamespaceURI());
> while (it.hasNext()) {
> Object o = it.next();
> marshalCollectionMember(o instanceof JAXBElement ? ((JAXBElement) o).getValue() : o, actualClass, genericType, encoding, os, m, qname
> .getNamespaceURI());
> }
> }
> os.write(endTag.getBytes());
> }
> {code}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.