Issue Details (XML | Word | Printable)

Key: CXF-852
Type: Bug Bug
Status: Closed Closed
Resolution: Fixed
Priority: Major Major
Assignee: Unassigned
Reporter: Derek Shaw
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
CXF

Array responses containing XmlAttribute cause exception in jettison

Created: 26/Jul/07 03:02 PM   Updated: 05/Oct/09 07:37 PM
Return to search
Component/s: Core
Affects Version/s: 2.0
Fix Version/s: 2.2.3

Time Tracking:
Not Specified

Environment: Windows XP, Java 1.5

Resolution Date: 03/Oct/09 05:27 PM


 Description  « Hide
When outputing lists of elements to JSON with an interface such as:

@Get
@HttpResource(location = "/media/objects/{containerID}/{startIndex}/{endIndex}")
public List<Media> getMediaObjectList( @WebParam(name = "containerID") int containerID,
@WebParam(name = "startIndex") int startIndex,
@WebParam(name = "endIndex") int endIndex)
throws MediaFault;

If the object within the array contains an XmlAttribute annotation on one of its properties an exception is thrown in Jettison when retrieving the json response. Note that the XML response works as expected. The problem seems to be located at writeAttribute() in MappedXMLStreamWriter. The code attempts to cast a JSONArray to a JSONObject. Looks like perhaps there needs to be an instance of check as there is in other locations. Or that it is prematurely attempting to output the attribute before pulling the underlying object out of the Array, though this is just a guess....

The workaround for me is to change the @XmlAttribute on the contained object to an @XmlElement.

Here is the exception:

org.apache.cxf.interceptor.Fault: Marshalling Error: org.codehaus.jettison.json.JSONArray
at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:155)
at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:40)
at org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:98)
at org.apache.cxf.interceptor.BareOutInterceptor.handleMessage(BareOutInterceptor.java:67)
at org.apache.cxf.binding.xml.interceptor.XMLMessageOutInterceptor.handleMessage(XMLMessageOutInterceptor.java:71)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:206)
at org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:73)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:206)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:67)
at org.apache.cxf.transport.servlet.ServletDestination.doMessage(ServletDestination.java:100)
at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:224)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:103)
at org.apache.cxf.transport.servlet.CXFServlet.invoke(CXFServlet.java:261)
at org.apache.cxf.transport.servlet.CXFServlet.doGet(CXFServlet.java:243)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.ClassCastException: org.codehaus.jettison.json.JSONArray
at org.codehaus.jettison.mapped.MappedXMLStreamWriter.writeAttribute(MappedXMLStreamWriter.java:93)
at org.codehaus.jettison.mapped.MappedXMLStreamWriter.writeAttribute(MappedXMLStreamWriter.java:130)
at org.codehaus.jettison.mapped.MappedXMLStreamWriter.writeAttribute(MappedXMLStreamWriter.java:134)
at com.sun.xml.bind.v2.runtime.output.XMLStreamWriterOutput.attribute(XMLStreamWriterOutput.java:88)
at com.sun.xml.bind.v2.runtime.output.XmlOutputAbstractImpl.attribute(XmlOutputAbstractImpl.java:70)
at com.sun.xml.bind.v2.runtime.XMLSerializer.attribute(XMLSerializer.java:413)
at com.sun.xml.bind.v2.runtime.property.AttributeProperty.serializeAttributes(AttributeProperty.java:63)
at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeAttributes(ClassBeanInfoImpl.java:295)
at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:617)
at com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:29)
at com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:132)
at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:101)
at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:286)
at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:532)
at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:276)
at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:461)
at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:292)
at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:148)
at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:138)

 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Daniel Kulp made changes - 03/Oct/09 05:27 PM
Field Original Value New Value
Resolution Fixed [ 1 ]
Fix Version/s 2.2.3 [ 12313983 ]
Status Open [ 1 ] Resolved [ 5 ]
Daniel Kulp made changes - 05/Oct/09 07:37 PM
Status Resolved [ 5 ] Closed [ 6 ]