2015-10-19 100 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瀏覽器,和所有的東西吧!