Chris Marshall created CXF-6179:
-----------------------------------

             Summary: Jackson JSON parsing Incompatible with the Transform 
Feature
                 Key: CXF-6179
                 URL: https://issues.apache.org/jira/browse/CXF-6179
             Project: CXF
          Issue Type: Bug
          Components: JAX-RS
    Affects Versions: 3.0.3
         Environment: CXF 3.0.3 and Jackson 2.4.4
            Reporter: Chris Marshall


Short version of the problem:
     Jackson (2.4.4) when used to parse inbound JSON messages is incompatible 
with the transform feature (CXF 3.0.3).  The transform feature 
(org.apache.cxf.feature.StaxTransformFeature) consumes the InputStream that 
jackson expects to read with the JSON content.

Longer version of the problem:
     I am currently building a service that is to be used by parterners that 
will be using various different tools, for example PHP and Windows .NET.  As a 
consequence I would like to create a service that support SOAP, Rest/XML and 
Rest/JSON.  The Rest versions should support messages both with and without 
namespaces.  At this point I have working SOAP, Rest/JSON and Rest/XML with 
namespaces.  In order to get Rest/XML without namespaces to work I added the 
use of the transform feature and it behaves as desired with XML.  However as 
soon as the transform feature is enabled the JSON parsing quits working.  
Digging into what is going on, the point at which Jackson tries to read the 
InputStream there are 0 available bytes when the transform feature is enabled.
     In order to diagnose the issue I overrode the readFrom method in 
com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider as follows:
package com.a100sys.affiliateportal.impl;

import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.Provider;

import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;

@Provider
@Consumes(MediaType.WILDCARD) // NOTE: required to support "non-standard" JSON 
variants
@Produces(MediaType.WILDCARD)
public class JsonTestProvider extends JacksonJaxbJsonProvider {

        @Override
        public Object readFrom(Class<Object> arg0, Type arg1, Annotation[] arg2,
                        MediaType arg3, MultivaluedMap<String, String> arg4,
                        InputStream arg5) throws IOException {
                int availableBytes = arg5.available();
                System.out.println("Available bytes " + availableBytes);
                Object readObject = super.readFrom(arg0, arg1, arg2, arg3, 
arg4, arg5);
                return readObject;
        }
        
}

In my test case without the transform feature enabled there are a nice healthy 
731 bytes available and when the transform feature is enable there are 0 
available bytes.



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

Reply via email to