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?
知道怎么做吗?
例如,您可以定义新的媒体类型,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+json
Accept标头发送请求,我们PrettyPrintJsonConverter
将会优先编写JSON表示.否则,MappingJackson2HttpMessageConverter
会将一个紧凑的JSON写入响应主体.
您可以使用ResponseBodyAdvice
甚至是拦截器实现相同的功能,但在我看来,注册一个全新的HttpMessageConverter
是更好的方法.