सबसे सुरुचिपूर्ण समाधान सुंदर/गैर-सुंदर के लिए स्विच डाल करने के लिए है एक फ़िल्टर में, और स्थैतिक विन्यास वस्तुओं का पुन: उपयोग करें। यह बेकार कचरा संग्रह रोकता है।
/**
* Evaluate the "pretty" query parameter. If given without any value, or with "true": pretty JSON output.
* E.g. /test?pretty or /test?pretty=true
* Otherwise output without any formatting.
*
* @see https://stackoverflow.com/questions/10532217/jax-rs-json-pretty-output
*/
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class RestPrettyJsonFilter implements ContainerResponseFilter {
public static final String QUERYPARAM_PRETTY = "pretty";
private static final IndentingModifier INDENTING_MODIFIER_PRETTY = new IndentingModifier(true);
private static final IndentingModifier INDENTING_MODIFIER_NOT_PRETTY = new IndentingModifier(false);
@Override
public void filter(ContainerRequestContext reqCtx, ContainerResponseContext respCtx) throws IOException {
boolean pretty = false;
UriInfo uriInfo = reqCtx.getUriInfo();
//log.info("prettyFilter: "+uriInfo.getPath());
MultivaluedMap<String, String> queryParameters = uriInfo.getQueryParameters();
if(queryParameters.containsKey(QUERYPARAM_PRETTY)) {
// Pretty query parameter is present
String prettyParam = queryParameters.getFirst(QUERYPARAM_PRETTY);
// Pretty is present without any value, or value is set to "true"?
if (prettyParam == null || "".equals(prettyParam) || "true".equals(prettyParam)) {
pretty = true;
}
}
// Prevent recreation of objects over and over again
//ObjectWriterInjector.set(new IndentingModifier(pretty));
if (pretty) {
ObjectWriterInjector.set(INDENTING_MODIFIER_PRETTY);
} else {
ObjectWriterInjector.set(INDENTING_MODIFIER_NOT_PRETTY);
}
}
/**
* Used to switch on/off pretty output for each response.
*/
public static class IndentingModifier extends ObjectWriterModifier {
private final boolean indent;
/** Minimal pretty printer is not printing pretty. */
private final static PrettyPrinter NOT_PRETTY_PRINTER = new com.fasterxml.jackson.core.util.MinimalPrettyPrinter();
public IndentingModifier(boolean indent) {
this.indent = indent;
}
/* (non-Javadoc)
* @see com.fasterxml.jackson.jaxrs.cfg.ObjectWriterModifier#modify(com.fasterxml.jackson.jaxrs.cfg.EndpointConfigBase, javax.ws.rs.core.MultivaluedMap, java.lang.Object, com.fasterxml.jackson.databind.ObjectWriter, com.fasterxml.jackson.core.JsonGenerator)
*/
@Override
public ObjectWriter modify(EndpointConfigBase<?> endpointConfigBase, MultivaluedMap<String, Object> multivaluedMap, Object o, ObjectWriter objectWriter, JsonGenerator jsonGenerator) throws IOException {
if(indent) {
// Pretty
jsonGenerator.useDefaultPrettyPrinter();
} else {
// Not pretty
jsonGenerator.setPrettyPrinter(NOT_PRETTY_PRINTER);
}
return objectWriter;
}
}
}
स्रोत
2017-12-19 08:16:44
क्या आप किसी भी बीन्स या एप्लिकेशन सर्वर का उपयोग कर रहे हैं? आप कॉन्फ़िगरेशन फ़ाइलों में 'prettyPrint' प्रॉपर्टी की जांच कर सकते हैं। –
अपडेट: मुझे उस परियोजना में ऑब्जेक्टमैपर के कई उदाहरण मिले हैं जिन पर मैं काम कर रहा हूं। अगर मैंने आउटपुटMapper.configure (SerializationConfig.Feature.INDENT_OUTPUT, false) जैसे कुछ लिखा है; फिर मुझे गैर-सुंदर प्रिंट JSON मिल जाएगा, मैं ठीक हूँ? – tamuren
* "OutputMapper.configure (SerializationConfig.Feature.INDENT_OUTPUT, झूठा); तो मुझे गैर-सुंदर प्रिंट JSON मिल जाएगा, ठीक है?" ** सिद्धांत रूप में, हाँ, यह ऑब्जेक्टमैपर का वह उदाहरण बनाना चाहिए सुंदर प्रिंट नहीं है। हालांकि ऑब्जेक्ट मैपर बनने के अन्य तरीके भी हो सकते हैं। –