如何在Spring MVC中基于http请求头启用json的动态漂亮打印? [英] How to enable dynamic pretty print of json based on http request header in Spring MVC?

查看:96
本文介绍了如何在Spring MVC中基于http请求头启用json的动态漂亮打印?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想基于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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆