如何在Spring MVC中基于http请求头启用json的动态漂亮打印? [英] How to enable dynamic pretty print of json based on http request header in Spring MVC?
问题描述
我想基于http参数动态地打印来自Spring MVC Restcontrollers的json响应(如此处所示: http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api#pretty-print-gzip )。
I want to pretty print json responses from Spring MVC Restcontrollers dynamically based on a http parameter (like suggested here: http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api#pretty-print-gzip).
我发现通过静态配置打印它的配置,但不是如何动态地打印它?
I have found configurations for pretty print it by static configuration, but not how to do that dynamically?
当使用Spring MVC for REST时,如何让Jackson完美地打印呈现的JSON?
知道怎么做吗?
推荐答案
介绍新媒体类型
您可以定义新的媒体类型,例如 application / pretty + json
并注册一个新的 HttpMessag转换为该媒体类型的eConverter
。实际上,如果客户端使用 Accept:application / pretty + json
标头发送请求,我们的新 HttpMessageConverter
将写入响应,否则,普通的旧 MappingJackson2HttpMessageConverter
会这样做。
Introducing A New Media Type
You can define a new Media Type, say, application/pretty+json
and register a new HttpMessageConverter
that converts to that Media Type. In fact, if client sends a request with Accept: application/pretty+json
header, our new HttpMessageConverter
will write the response, Otherwise, the plain old MappingJackson2HttpMessageConverter
would do that.
所以,扩展 MappingJackson2HttpMessageConverter
如下所示:
public class PrettyPrintJsonConverter extends MappingJackson2HttpMessageConverter {
public PrettyPrintJsonConverter() {
setPrettyPrint(true);
}
@Override
public List<MediaType> getSupportedMediaTypes() {
return Collections.singletonList(new MediaType("application", "pretty+json"));
}
@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
boolean canWrite = super.canWrite(clazz, mediaType);
boolean canWritePrettily = mediaType != null &&
mediaType.getSubtype().equals("pretty+json");
return canWrite && canWritePrettily;
}
}
那个 setPrettyPrint(true)构造函数中的
将为我们完成。然后我们应该注册这个 HttpMessageConverter
:
That setPrettyPrint(true)
in constructor will do the trick for us. Then we should register this HttpMessageConverter
:
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new PrettyPrintJsonConverter());
}
}
正如我所说,如果客户发送请求 application / pretty + json
接受标头,我们的 PrettyPrintJsonConverter
将编写JSON表示 Prettily 。否则, MappingJackson2HttpMessageConverter
会将一个紧凑的JSON写入响应主体。
As i said, if client send a request with application/pretty+json
Accept header, our PrettyPrintJsonConverter
will write the JSON representation Prettily. Otherwise, MappingJackson2HttpMessageConverter
would write a compact JSON to the response body.
您可以使用 ResponseBodyAdvice
甚至拦截器实现相同目标,但在我看来,注册一个全新的 HttpMessageConverter
是更好的方法。
You can achieve the same with a ResponseBodyAdvice
or even Interceptors but in my opinion, registering a brand new HttpMessageConverter
is the better approach.
这篇关于如何在Spring MVC中基于http请求头启用json的动态漂亮打印?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!