gpt4 book ai didi

java - 如何在Spring MVC中启用基于http请求头的json动态 pretty-print ?

转载 作者:搜寻专家 更新时间:2023-10-31 19:37:23 24 4
gpt4 key购买 nike

我想根据 http 参数动态打印来自 Spring MVC Restcontrollers 的 json 响应(就像这里建议的:http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api#pretty-print-gzip)。

我已经通过静态配置找到了 pretty-print 的配置,但不知道如何动态地进行?

When using Spring MVC for REST, how do you enable Jackson to pretty-print rendered JSON?

知道怎么做吗?

最佳答案

引入一种新的媒体类型


你可以定义一个新的 Media Type,比如 application/pretty+json 并注册一个新的 HttpMessageConverter 来转换成那个媒体类型.事实上,如果客户端发送带有 Accept: application/pretty+json header 的请求,我们新的 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 header 的请求,我们的 PrettyPrintJsonConverter 将写入 JSON 表示 Prettily .否则,MappingJackson2HttpMessageConverter 会将紧凑的 JSON 写入响应主体。

您可以使用 ResponseBodyAdvice 甚至 Interceptors 实现相同的目的,但在我看来,注册一个全新的 HttpMessageConverter 是更好的方法。

关于java - 如何在Spring MVC中启用基于http请求头的json动态 pretty-print ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36669172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com