Swagger 2 (Spring fox) добавляет «es» к моему API

Я просто пытался интегрировать Swagger в свой проект Spring Boot (JAX-RS), созданный с помощью Gradle. Мне удалось создать докер ( Swagger UI) для следующего: Swagger UI Docker

Я настроил свой чванство с настройками по умолчанию следующим образом:

package com.abc;

import lombok.extern.slf4j.Slf4j;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Import;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

import springfox.documentation.swagger2.annotations.EnableSwagger2;

@EnableAutoConfiguration
@SpringBootApplication
@EnableMongoRepositories
@Slf4j
@Import({springfox.documentation.spring.data.rest.configuration.SpringDataRestConfiguration.class,springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration.class})
@EnableSwagger2
public class ServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceApplication.class, args);
    }

    public static void run(String[] args) throws Exception{
        log.info("Started application on: 8080");
    }
}

Как мы видим на изображении для GET Events API, докер показывает /eventses. Итак, откуда он добавил es< /strong> в /events API, который записывается как:

@GET
public HashMap<String, Object> getEventList(@DefaultValue("1") @QueryParam("page") int page,
        @DefaultValue("10") @QueryParam("rpp") int rpp, @QueryParam("events") String eventIds) {
    HashMap<String, Object> eventsResultMap= new HashMap<String, Object>();

    List<Events> events = null;

    if (eventIds != null && eventIds.length() > 0) {
        List<String> eventsIdList = Arrays.asList(eventIds.split(","));
        log.info("" + eventsIdList);
        events = eventService.getEvents(eventsIdList);
    } else {
        events = eventService.getEvents(page - 1, rpp);
    }
    eventsResultMap.put("EVENTS", events);

    HashMap<String, Object> recordsMetaMap = new HashMap<String, Object>();
    recordsMetaMap.put("total", eventService.totalCount());
    recordsMetaMap.put("page", page);
    recordsMetaMap.put("rpp", rpp);
    eventsResultMap.put("_metadata", recordsMetaMap);
    log.info("The events you have queried for are:" + eventsResultMap);
    return eventsResultMap;
}

Пожалуйста, направьте меня, где я делаю неправильно. Какие пользовательские конфиги нужно сделать.

Я взял Reference из официальной документации Spring.


person CandleCoder    schedule 04.03.2017    source источник
comment
я не думаю, что он правильно читает метод. Например, он пишется как @GET, а на картинке показывается как POST и другие типы. Просто мысль .... и я думаю, что es связано с типом возврата HashMap. Вы пробовали использовать аннотацию @ApiOperation?   -  person Rajkishan Swami    schedule 06.03.2017


Ответы (2)


Если вы используете реализацию jax-rs с весенней загрузкой, вам следует использовать библиотеки jax-rs swagger-core, а не spring fox. Команда Swagger предоставила очень подробные инструкции здесь о том, как настроить ваше приложение для различных реализаций, таких как jersey, rest-easy и т. д. Мне было очень легко интегрировать jersey 2.x.

Чтобы сделать вашу документацию по swagger богатой, вы должны попытаться предоставить как можно больше метаданных, используя различные аннотации swagger, как задокументировано здесь. Swagger широко использует эти аннотации в сочетании с аннотациями jax-rs в некоторых случаях (например, идентификация QueryParam и PathParam).

Если вы сообщите мне, какую реализацию jax-rs вы используете, я смогу предоставить вам образец конфигурации.

Изменить:

Для Джерси 2.x вам нужно будет добавить что-то подобное в свой класс конфигурации Джерси (который расширяет org.glassfish.jersey.server.ResourceConfig):

@Bean
public BeanConfig swaggerConfig() {

    register(ApiListingResource.class);
    register(SwaggerSerializers.class);

    BeanConfig config = new BeanConfig();
    config.setConfigId("your-config-id");
    config.setTitle( "Your Title" );
    config.setSchemes(new String[] { "https", "http" });
    config.setBasePath("your application base path E.g. /api");
    config.setResourcePackage("package to be scanned E.g. com.example");
    config.setPrettyPrint(true);
    config.setScan(true);
    return config;
}

Помимо этого, вам нужно будет аннотировать классы конечных точек (сервисов) с помощью аннотаций swagger. Например.

@Path("/material")
@Service
@Api(value = "Material")
public class MaterialEndpoint {

    @POST
    @ApiOperation(value = "Create Material")
    @ApiResponses(value = { @ApiResponse(code = 201, message = "Success", response = CreateMaterialResponse.class),
                            @ApiResponse(code = 409, message = "Failure", response = ErrorResponse.class) })
    public Response createMaterial(CreateMaterialRequest createMaterialRequest){
// Code goes here
   }

}

И ваши сущности с чванливыми аннотациями. Вам решать, насколько богатой должна быть документация по чванству. В зависимости от этого вы можете аннотировать больше или меньше классов.

person ritesh.garg    schedule 08.03.2017
comment
Этот документ github. com/swagger-api/swagger-core/wiki/ посвящен проекту maven. Как насчет Gradle? - person CandleCoder; 08.03.2017
comment
Я считаю, что до тех пор, пока вы указываете правильные местоположения (MavenCentral()) в разделе своих репозиториев и предоставляете зависимость в виде градиента, конфигурация должна работать. - person ritesh.garg; 08.03.2017
comment
Я использую Джерси 2.X - person CandleCoder; 10.03.2017
comment
Хорошо, давайте проверим это вечером и сообщим вам ... Спасибо за ваши драгоценные усилия, братан ... - person CandleCoder; 10.03.2017
comment
Вы удалили конфигурацию spring fox? В частности, это: @Import({springfox.documentation.spring.data.rest.configuration.SpringDataRestConfiguration.class,springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration.class}) @EnableSwagger2 и любая зависимость от Spring Fox, потому что Spring Boot может инициализировать их из-за их присутствия в пути к классам - person ritesh.garg; 10.03.2017
comment
Это не работает, но я все еще принимаю ваш ответ, так как моя награда будет потрачена впустую, и вы действительно приложили много усилий, чтобы заставить ее работать, но, к сожалению, это не сработало. - person CandleCoder; 12.03.2017
comment
Спасибо за это. Но можете ли вы загрузить свой пример проекта на github или что-то в этом роде? У меня чванство работает с джерси 2.х плавно. Мне очень интересно узнать, почему это не работает для вас. Я почти уверен, что это какой-то маленький промах. - person ritesh.garg; 12.03.2017
comment
Я использую для этого Bitbucket... Пожалуйста, дайте мне свой адрес электронной почты, чтобы я мог добавить вас туда, так как проект является частным.. - person CandleCoder; 13.03.2017
comment
Вы нашли какую-либо проблему в этом? - person CandleCoder; 14.03.2017
comment
Я получил код, но не успел его посмотреть. - person ritesh.garg; 14.03.2017
comment
конечно ... Дайте мне знать, если вы получите какую-либо подсказку :) - person CandleCoder; 14.03.2017

Все в /eventses исходит из поддержки Springfox Spring Data REST и не имеет ничего общего с методом getEventList в вашем контроллере. Если вы не хотите, чтобы ваши сущности автоматически обнаруживались, удаление класса из строки @Import должно помочь.

person MrMister    schedule 06.03.2017
comment
Да, я уже пробовал этот трюк, прежде чем задал этот вопрос. Извините, что не упомянул об этом в своем вопросе. Но проблема в том, что если я удалю строку @Import, тогда все мои контроллеры теперь видно), не могли бы вы сказать мне, как я могу сделать мои контроллеры сканируемыми? - person CandleCoder; 07.03.2017
comment
Действительно, вам нужно рассказать Swagger о ваших контроллерах. Есть ли в вашем проекте docket? Вы можете взять очень хороший пример для класса SwaggerConfig из этого связанного вопроса. Обычно я ограничиваю обнаружение контроллеров с помощью предиката RequestHandlerSelectors.basePackage, но вы действительно можете начать с .any() и убедиться, что ваши контроллеры подхватываются. - person MrMister; 07.03.2017
comment
Я попробую это и дам вам знать... а также приму ваши ответы (если это сработает) - person CandleCoder; 08.03.2017