I need to pretty print my JSON or XML generated by MoxyJsonProvider on a per request base. I'm adding a custom HTTP header "pretty" in my JAX-RS Response with a value true|false read from a query parameter:
Response.ok(myEntity).header("pretty", params.getPretty()).build()
Later my own sub class of ConfigurableMoxyJsonProvider should process this header and call setFormattedOutput(true) (or via Marshaller property JAXB_FORMATTED_OUTPUT). But my sub class of ConfigurableMoxyJsonProvider always loses against original MOXy ConfigurableMoxyJsonProvider impl when it comes to MessageBodyWriter resolution. Thus my class's writeTo or preWriteTo method never get called.
How can I get my class's preWriteTo() method to work for all resources with annotation
@Produces({MediaType.APPLICATION_JSON, MediaType.WILDCARD, MediaType.APPLICATION_XML})
independently of a certain class type.
Do I have to remove ConfigurableMoxyJsonProvider from my application and inject mine instead? And if so, how do I do this?
For the JSON-binding you could extend MOXyJsonProvider
(which implements MessageBodyReader
/MessageBodyWriter
) and override the preWriteTo
method to check the header and then enable formatted output.
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.core.*;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider;
@Provider
public class ExtendedMOXyJsonProvider extends MOXyJsonProvider {
@Override
protected void preWriteTo(Object object, Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders, Marshaller marshaller)
throws JAXBException {
Boolean isPretty = Boolean.valueOf((String) httpHeaders.getFirst("pretty"));
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, isPretty);
}
}