Как переопределить значение заголовка, заданное Swagger по умолчанию?

#java #spring #spring-boot #swagger-ui #swagger-2.0

#java #весна #весенняя загрузка #swagger-пользовательский интерфейс #swagger-2.0

Вопрос:

Я использую Swagger версии 2.4.0 и Spring Boot 2.0.4.RELEASE и имею приложение с несколькими конечными точками API и с конфигурацией Swagger по умолчанию, в которой значение заголовка по умолчанию задано равным application/json .

SwaggerConfig.java

 @Configuration
@EnableSwagger2
public class SwaggerConfig {

    private static final Set<String> DEFAULT_PRODUCES_AND_CONSUMES = ImmutableSet.of(
            "application/json"
    );

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .produces(DEFAULT_PRODUCES_AND_CONSUMES)
                .consumes(DEFAULT_PRODUCES_AND_CONSUMES);
    }
}
  

И с настроенной конечной точкой API.

ApiEndpoint.java

 @Consumes(MediaType.APPLICATION_JSON)
@Api(value = "/transform", protocols = "http, https")
@RequestMapping(value = "/transform")
public interface ApiEndpoint {

    @POST
    @RequestMapping(value = "/text", method = RequestMethod.POST)
    @ApiOperation(value = "Transform to plain text", produces = MediaType.TEXT_PLAIN)
    @CrossOrigin
    String transformToText(@RequestBody TransformRequest transformRequest) throws Exception;
}
  

Теперь я хочу, чтобы эта конечная точка выдавала ответ с типом содержимого, являющимся только обычным текстом, но SwaggerConfig добавляет application/json параметр по умолчанию. Итак, чтобы правильно использовать эту конечную точку, мне нужно было бы каждый раз менять тип содержимого ответа с application/json на text/plain , что довольно быстро раздражало бы, учитывая, что эта конечная точка используется для тестирования. Есть ли способ переопределить SwaggerConfig или добавить параметр, чтобы text / plain был единственным вариантом, или, по крайней мере, установить text / plain в качестве параметра по умолчанию только для этой одной конечной точки?

Ответ №1:

вам просто нужно определить тип содержимого ответа в аннотации RequestMapping.

Это,

  @RequestMapping(value = "/text", method = RequestMethod.POST)
  

будет заменено на,

  @RequestMapping(value = "/text", method = RequestMethod.POST, produces="text/plain")
  

Означает, что вы должны определить в RequestMapping, какой тип содержимого будет возвращать это сопоставление.

Примечание: Будет хорошей практикой, если вы используете

 @PostMapping(value = "/text", produces="text/plain")
  

Надеюсь, решение будет работать нормально.

Комментарии:

1. Это решение не совсем то, что мне нужно. В настоящее время у меня уже есть как application / json, так и text / plain в качестве опций, но application / json выбран по умолчанию в swagger-ui. Итак, другими словами, чтобы правильно использовать конечную точку, мне нужно было бы менять ее каждый раз при перезагрузке страницы и видеть, что это довольно раздражает меня и мою команду. Мне просто интересно, есть ли способ заставить swagger-ui отображать текст / обычный как единственный вариант для этой конечной точки или, по крайней мере, показывать его как параметр по умолчанию. P.S. Хороший момент в заметке @PostMapping, я буду иметь это в виду. Спасибо.

Ответ №2:

просто укажите тип по порядку в аннотации конечной точки, пример:

атрибут выдает получение массива, поэтому вы можете указать более одного типа

 @PostMapping(value = "/text", produces = { MediaType.TEXT_PLAIN_VALUE, MediaType.APPLICATION_JSON_VALUE })
  

Я советую удалить produce в @Bean, поскольку его API содержит конечную точку, которая не всегда соответствует стандартной идее «application / json«