如何在Spring MVC中基于http请求头启用json的动态漂亮打印?

Jen*_*mer 6 java spring spring-mvc jackson

我想基于一个http参数动态地打印来自Spring MVC Restcontrollers的json响应(如下所示:http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api#pretty-print- gzip).

我已经找到了通过静态配置进行漂亮打印的配置,但不是如何动态地进行打印?

使用Spring MVC for REST时,如何让Jackson能够打印出漂亮的JSON?

知道怎么做吗?

Ali*_*ani 5

介绍一种新媒体类型


例如,您可以定义新的媒体类型,application/pretty+json并注册HttpMessageConverter转换为该媒体类型的新媒体类型.实际上,如果客户端发送带有Accept: application/pretty+json标头的请求,我们的新服务器HttpMessageConverter将写入响应,否则,普通老客户MappingJackson2HttpMessageConverter会这样做.

所以,扩展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;
    }
}
Run Code Online (Sandbox Code Playgroud)

setPrettyPrint(true)构造函数中的那个将为我们做的伎俩.然后我们应该注册这个HttpMessageConverter:

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new PrettyPrintJsonConverter());
    }
}
Run Code Online (Sandbox Code Playgroud)

正如我所说,如果客户端使用application/pretty+jsonAccept标头发送请求,我们PrettyPrintJsonConverter将会优先编写JSON表示.否则,MappingJackson2HttpMessageConverter会将一个紧凑的JSON写入响应主体.

您可以使用ResponseBodyAdvice甚至是拦截器实现相同的功能,但在我看来,注册一个全新的HttpMessageConverter是更好的方法.