2015-10-19 196 views
3

我有一个项目与春季启动,我想用swagger2来记录我的JSON Web服务。Swagger 2接受XML而不是JSON

我有这样的配置:

@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

在招摇的用户界面,它工作正常。但是当我在浏览器中直接尝试此链接时,出现此错误: enter image description here

使用Firebug,我发现它接受XML内容而不是JSON内容。 enter image description here

如何修改swagger配置以接受JSON内容?

回答

1

你遇到了问题,因为Spring MVC默认让服务器在浏览器中呈现XML而不是JSON。 The official document说:

获取服务器来渲染XML而不是JSON你可能要发送接受:文/ XML头(或使用浏览器)。

所以你需要做的就是让服务器在浏览器中呈现JSON。

当你深入到浏览器中,你会看到请求头请求:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 

如果你调试到春天开机,你会看到Spring MVC的将默认委托HttpMessageConverters包括MappingJackson2XmlHttpMessageConverterMappingJackson2HttpMessageConverter

MappingJackson2HttpMessageConverter是渲染json而MappingJackson2XmlHttpMessageConverter是渲染xml。

他们都有一个字段supportedMediaTypes这意味着什么mediatypes支持。

supportedMediaTypesMappingJackson2HttpMessageConverter的值是:

enter image description here

supportedMediaTypesMappingJackson2XmlHttpMessageConverter的值是:

enter image description here

有一个“文本/ XML;字符集= UTF- 8'在MappingJackson2XmlHttpMessageConverter。这就是为什么浏览器呈现XML的JSON展开。

所以你需要添加自定义MappingJackson2XmlHttpMessageConverter支持“文本/ XML”,例如:

@Configuration 
public class WebConfig extends WebMvcConfigurerAdapter { 
    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 
     List<MediaType> 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浏览器,和所有的东西吧!