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)