We have a whole set of JAX-RS REST services running on top of Apache CXF and Jackson. We use JAXB annotations to take care of marshalling POJOs to JSON, works great.
However, we have one or two places where we want to return raw JSON string (that we fetch from a Redis cache).
Jackson always wraps the string in double quotes and escapes all the double quotes in it, e.g.
@GET @Produces("application/json")
public Response getData() {
String json = ...get from Redis...
return Response.ok(json,"application/json").build()
}
gives us
"{\"test\":1}"
instead of
{"test":1}
I've tried multiple things, adding RawSerializer(String.class) to the Object mapper, nothing works. The only thing that works is if I set the media type to plain string, which bypassed Jackson, but is not good, since I am returning the wrong content type
i.e.
return Response.ok(json,"text/plain").build()
works, but poorly (wrong content type, which screws up .Net WCF apps that call us)
Found the solution finally. The trick was to extend the JacksonJsonProvider (which we use in CXF to force it to use Jackson instead of Jettison) and tell it to bypass Jackson altogether when dealing with raw Strings:
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType){
if (String.class.equals(type)) {
//pass strings as-is, they are most likely cached JSON responses
return false;
} else {
return true;
}
}
Works perfectly.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With