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


问题内容

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

我已经找到了可以通过静态配置漂亮地打印出来的配置,但是没有动态地做到这一点?

任何想法如何做到这一点?


问题答案:

引入新的媒体类型


您可以定义一个新的 媒体类型
,例如,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;
    }
}

setPrettyPrint(true)构造函数中的那个将为我们解决问题。然后,我们应该注册HttpMessageConverter

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

如我所说,如果客户端发送带有application/pretty+jsonAccept标头的请求,我们PrettyPrintJsonConverter将编写JSON表示形式
Prettily 。否则,MappingJackson2HttpMessageConverter将紧凑的JSON写入响应主体。

您可以使用 InterceptorResponseBodyAdvice或什至 Interceptors
达到相同的效果,但我认为,注册全新HttpMessageConverter的方法更好。