#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«