Swagger 2 принимает xml вместо json

У меня есть проект с весенней загрузкой, и я хочу использовать swagger2 для документирования своих веб-сервисов 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< /а>

В пользовательском интерфейсе swagger он работает нормально. Но когда я пробую эту ссылку прямо в своем браузере, у меня возникает эта ошибка: введите здесь описание изображения

С Firebug я вижу, что он принимает содержимое XML вместо содержимого JSON. введите здесь описание изображения

Как я могу изменить конфигурацию swagger, чтобы принимать содержимое JSON?


person YLombardi    schedule 19.10.2015    source источник


Ответы (3)


Вы сталкиваетесь с проблемой из-за того, что 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

И если вы отлаживаете весеннюю загрузку, вы увидите, что весенний mvc по умолчанию делегат HttpMessageConverters включает MappingJackson2XmlHttpMessageConverter и MappingJackson2HttpMessageConverter.

MappingJackson2HttpMessageConverter предназначен для рендеринга json, а MappingJackson2XmlHttpMessageConverter — для рендеринга xml.

У них обоих есть поле supportedMediaTypes, которое означает, какие медиатипы поддерживаются.

Значение supportedMediaTypes в MappingJackson2HttpMessageConverter равно:

введите здесь описание изображения

Значение supportedMediaTypes в MappingJackson2XmlHttpMessageConverter равно:

введите здесь описание изображения

В MappingJackson2XmlHttpMessageConverter есть 'text/xml;charset=UTF-8'. Вот почему браузер отображает 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 в браузере, и все будет в порядке!

person zhouji    schedule 17.03.2016
comment
Не работает для меня. Реализация этого решения изменила ответ сервера ContentType с application/xhtml... на text/html, но не изменила его на application/json :( - person Mate Šimović; 10.07.2018

Что сработало для меня, так это обновление зависимостей Maven для springfox-swagger2 и springfox-swagger-ui.

Новейшей рабочей комбинацией для меня была:

    <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.8.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.2</version>
    </dependency>
person Mate Šimović    schedule 10.07.2018

У меня была похожая проблема, что API Swagger возвращает XML, когда я пытался прочитать его с помощью веб-браузера.

Я решил эту проблему с помощью другого подхода.
Если вы попытаетесь вызвать конечную точку с помощью некоторых других инструментов, таких как командный инструмент PostMan или Curl, он будет правильно возвращать JSON.

Похоже, это произошло только в веб-браузере.

Если у вас есть расширение Jackson XML в pom.xml, вы можете попробовать этот подход. Но если вам нужно вернуть XML-данные в качестве ответа, найдите другое решение.

Это мой подход, добавьте ниже конфигурацию, которая расширяет класс WebMvcConfigurationSupport до исходного кода проекта.

@Configuration
public class MessageConverterConfiguration extends WebMvcConfigurationSupport {
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        HttpMessageConverter<?> target = null;

        for (HttpMessageConverter<?> converter : converters) { 
            if (converter.getClass() == MappingJackson2XmlHttpMessageConverter.class) {
                target = converter;
            }
        }

        if (target != null) {
            converters.remove(target);
        }
    }
}
  1. Для обычного запроса типа GET веб-браузер отправляет данные запроса на конечную точку, включая ключ «Принять» в заголовке запроса, имеющий в нем значение «xml».

  2. Кроме того, на стороне сервера, даже если тип данных ответа — JSON, и даже если указан преобразователь сообщений JSON, Spring сначала выбирает преобразователь сообщений XML, если он совместим с данными JSON.

  3. Помимо вышеизложенного, процесс выбора основан на порядке значения «Принять» из запроса.

    • You may debug the AbstractMessageConverterMethodProcessor, especially the writeWithMessageConverters method during the response process.
  4. В процессе выбора Spring подбирает подходящий преобразователь на основе списка зарегистрированных преобразователей сообщений, который инициализируется в процессе инициализации системы WebMvcConfigurationSupport.

  5. WebMvcConfigurationSupport предоставляет extendMessageConverters для расширения или изменения списка преобразователей.

  6. Поэтому я попытался удалить этот специальный преобразователь XML-сообщений из списка, и он работает.

Хотя приведенное выше решение сработало для меня, вы не можете использовать этот подход.

Пожалуйста, найдите другое решение, если вам нужно вернуть XML-данные в качестве ответа.

person Young K. Jun    schedule 11.02.2020