Springfox 招摇 - 没有带有春季靴球衣和 gradle 的 api-docs



我有一个带有球衣和 gradle 的 Spring 启动应用程序,我正在尝试使用 springfox 自动生成 API 文档。

我按照这里的步骤操作:http://springfox.github.io/springfox/docs/current/

这是我所做的:

  • build.gradle:

    dependencies {
        .........
        //Swagger
        compile "io.springfox:springfox-swagger2:2.4.0"
        compile "io.springfox:springfox-bean-validators:2.4.0"
        compile 'io.springfox:springfox-swagger-ui:2.4.0'
    }
    
  • 弹簧启动应用程序:

    @SpringBootApplication
    @EnableSwagger2
    public class AnalyzerServiceApplication{
    public static void main(String[] args) {
        SpringApplication.run(AnalyzerServiceApplication.class, args);
    }
    @Bean
    public Docket analyzerApi() {
    return new Docket(DocumentationType.SWAGGER_2)
    .select()
        .apis(RequestHandlerSelectors.any())
        .paths(PathSelectors.any())
        .build()
    .pathMapping("/")
    .directModelSubstitute(LocalDate.class, String.class)
    .genericModelSubstitutes(ResponseEntity.class)
    .alternateTypeRules(
        newRule(typeResolver.resolve(DeferredResult.class,
        typeResolver.resolve(ResponseEntity.class, WildcardType.class)),
        typeResolver.resolve(WildcardType.class)))
    .useDefaultResponseMessages(false)
    .globalResponseMessage(RequestMethod.GET,
        newArrayList(new ResponseMessageBuilder()
            .code(500)
            .message("500 message")
            .responseModel(new ModelRef("Error"))
            .build()))
    .securitySchemes(newArrayList(apiKey()))
    .securityContexts(newArrayList(securityContext()))
    .enableUrlTemplating(true)
    .globalOperationParameters(
        newArrayList(new ParameterBuilder()
            .name("someGlobalParameter")
            .description("Description of someGlobalParameter")
            .modelRef(new ModelRef("string"))
            .parameterType("query")
            .required(true)
            .build()))
        .tags(new Tag("Pet Service", "All apis relating to pets")) 
        ;
    }
    @Autowired
    private TypeResolver typeResolver;
    private ApiKey apiKey() {
        return new ApiKey("mykey", "api_key", "header");
    }
    private SecurityContext securityContext() {
        return SecurityContext.builder()
            .securityReferences(defaultAuth())
            .forPaths(PathSelectors.regex("/anyPath.*"))
            .build();
    }
    List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope
            = new AuthorizationScope("global", "accessEverything");
            AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        return newArrayList(
            new SecurityReference("mykey", authorizationScopes));
    }
    @Bean
    SecurityConfiguration security() {
        return new SecurityConfiguration(
            "test-app-client-id",
            "test-app-client-secret",
            "test-app-realm",
            "test-app",
            "apiKey",
            ApiKeyVehicle.HEADER, 
            "api_key", 
            "," /*scope separator*/);
    }
    @Bean
    UiConfiguration uiConfig() {
        return new UiConfiguration("validatorUrl");
    }
    
  • 现在是控制器(泽西岛)

    @Api(value = "/widget")
    @Path("/widget")
    @Component
    public class WidgetController extends BaseController {
    @Autowired
    private WidgetService widgetService;
    @GET
    @Path("/secHealth")
    @ApiOperation(value = "Find pet by ID", notes = "Returns a pet when ID < 10.  ID > 10 or nonintegers will simulate API error conditions", response = Pet.class)
    @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid ID supplied"),
    @ApiResponse(code = 404, message = "Pet not found") })
    public Response getPet() {
        //Do something
    }
    

当我启动服务器并导航到 http://localhost:8080/swagger-ui.html 时,我可以看到"绿色"UI 屏幕,其中仅列出了基本错误控制器。我自己的控制器不在那里。

我做错了什么?谢谢家伙

截至版本2.5.0 springfox仅支持spring-mvc控制器。不支持像jersey这样的Jax-rs实现。

目前使用 springfox 的替代方案是将 swagger-core 库用于基于 jax-rs/jersey 的服务。

它确实具有在2.6+中实现对球衣的支持所需的钩子。这是在本期中实现它的方法的摘录

目前 ResourceConfig 有一个名为"getClasses"的方法,它将 列出已注册的所有内容。如资源,过滤器等...也许这个 可以帮忙。但请注意,返回的类也可能是 过滤器或任何其他您可以在 Jersey2 注册的东西。

要能够从 Springfox 招摇 UI 中查看 Jersey 方法,请执行以下操作:

  1. 使用以下 https://github.com/swagger-api/swagger-core/wiki/Swagger-Core-Jersey-2.X-Project-Setup-1.5 配置您的 Swagger 与球衣
  2. 配置春狐招摇如下 http://springfox.github.io/springfox/docs/current/
  3. 添加 SpringBoot 应用程序配置类(用 @Configuration 注释):

    @Value("${springfox.documentation.swagger.v2.path}") private String swagger2Endpoint;

  4. 在 application.properties 中添加对 Jersey swagger.json 的引用:

    springfox.documentation.swagger.v2.path=/{change it to your Jersey api path}/swagger.json

现在你应该能够看到Jersey Swagger从Springfox Swagger UI页面生成的api。

感谢 @Dilip-Krishnan 的 springfox 更新和 @Guy-Hudara 的问题,我想出了以下解决方案来在我的 springboot 球衣驱动的应用程序中获得大摇大摆的支持:

import io.swagger.jaxrs.config.BeanConfig;
import io.swagger.jaxrs.listing.ApiListingResource;
import io.swagger.jaxrs.listing.SwaggerSerializers;
import org.glassfish.jersey.server.ResourceConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
/**
 * As of version 2.5.0 springfox only supports spring-mvc controllers. Jax-rs implementations like jersey aren't supported.
 *
 * Fortunately io.swagger::swagger-jersey2-jaxrs::1.5.3 have the hooks needed to implement support for jersey in 2.6+.
 *
 * some pointers I used to get this swagger config done and swagger-core, springboot and jersey integrated:
 * http://stackoverflow.com/questions/37640863/springfox-swagger-no-api-docs-with-spring-boot-jersey-and-gardle
 * https://www.insaneprogramming.be/blog/2015/09/04/spring-jaxrs/
 * https://github.com/swagger-api/swagger-core/wiki/Swagger-Core-Jersey-2.X-Project-Setup-1.5#adding-the-dependencies-to-your-application
 *
 */
@Configuration
public class SwaggerConfiguration {
    @Autowired
    ResourceConfig resourceConfig;
    @PostConstruct
    public void configure() {
        resourceConfig.register(ApiListingResource.class);
        resourceConfig.register(SwaggerSerializers.class);
        BeanConfig beanConfig = new BeanConfig();
        beanConfig.setVersion("1.0.2");
        beanConfig.setSchemes(new String[]{"http"});
        beanConfig.setHost("localhost:8888");
        beanConfig.setBasePath("/api");
        beanConfig.setResourcePackage("com.my.resource");
        beanConfig.setPrettyPrint(true);
        beanConfig.setScan(true);
    }
}

这对我来说效果很好

相关内容

最新更新