您可以定义一个新的 媒体类型 ,例如,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+json
Accept标头的请求,我们PrettyPrintJsonConverter
将编写JSON表示形式Prettily 。否则,MappingJackson2HttpMessageConverter
将紧凑的JSON写入响应主体。
您可以使用 InterceptorResponseBodyAdvice
或什至 Interceptors 达到相同的效果,但我认为,注册全新HttpMessageConverter
的方法更好。