Swagger 2接受xml而不是json
我有一个带有spring boot的项目,我想使用swagger2来记录我的json Web服务。
我有这个配置:
@Configuration @EnableSwagger2 public class Swagger2Config { @Bean public Docket welcomeMessageApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("My API") .description("Lorem Ipsum is simply dummy text of ...") .termsOfServiceUrl("an url") .contact("contact") .license("") .licenseUrl("") .version("2.0") .build(); }
要阅读文档,我使用以下链接: http:// localhost:9081 / v2 / api-docs
在招摇的UI中,它工作正常。 但是当我在浏览器中直接尝试此链接时,出现此错误:
使用Firebug,我发现它接受XML内容而不是JSON内容。
如何修改swagger配置以接受JSON内容?
您遇到问题是因为Spring MVC默认让服务器在浏览器中呈现XML而不是JSON。 官方文件说:
要使服务器呈现XML而不是JSON,您可能必须发送Accept:text / xml标头(或使用浏览器)。
所以你需要做的就是让服务器在浏览器中呈现JSON。
当您深入了解浏览器中的请求时,您将看到请求标头:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
如果你调试到spring boot,你会看到spring mvc将默认委托HttpMessageConverters
包括MappingJackson2XmlHttpMessageConverter
和MappingJackson2HttpMessageConverter
。
MappingJackson2HttpMessageConverter
用于渲染json, MappingJackson2XmlHttpMessageConverter
用于渲染xml。
它们都有一个字段supportedMediaTypes
,这意味着supportedMediaTypes
哪种mediatype。
MappingJackson2HttpMessageConverter
中MappingJackson2HttpMessageConverter
值为:
MappingJackson2XmlHttpMessageConverter
中MappingJackson2XmlHttpMessageConverter
值为:
MappingJackson2XmlHttpMessageConverter
有一个’text / xml; charset = UTF-8’。这就是为什么浏览器渲染xml的json。
所以你需要添加一个支持’text / xml’的自定义MappingJackson2XmlHttpMessageConverter
,例如:
@Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(List> converters) { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); List list = new ArrayList<>(); list.add(MediaType.APPLICATION_JSON_UTF8); list.add(new MediaType("text", "html", Charset.forName("UTF-8"))); list.add(new MediaType("application", "*+json", Charset.forName("UTF-8"))); converter.setSupportedMediaTypes(list); converters.add(converter); } }
试试这个,浏览器将在浏览器中呈现JSON而不是XML,一切正常!
对我有用的是更新springfox-swagger2和springfox-swagger-ui的Maven依赖项。
对我来说,最新的工作组合是:
io.springfox springfox-swagger2 2.8.0 io.springfox springfox-swagger-ui 2.9.2