Swagger grails Integration

2019-09-15 14:35发布

问题:

I am new to swagger and I want to integrate swagger to Restful API project using grails framework. Please help if anybody have any idea what i am doing wrong?

my grails specification as below:

    | Grails Version: 3.0.7
    | Groovy Version: 2.4.4
    | JVM Version: 1.8.0_71

Did some settings for swagger as below:

in build.gradle:

    dependencies {
        ...
        compile "io.swagger:swagger-core:1.5.3"
        compile "io.swagger:swagger-jaxrs:1.5.3"
        ...
    }

in resources.groovy

    import io.swagger.jaxrs.config.BeanConfig
    beans = {
        swaggerConfig(BeanConfig) {
            def serverUrl = "http://localhost:8080/" 
            def hostName = "localhost:8080" 
            resourcePackage = "grails.rest.example" 
            host = hostName
            basePath = "/api"
            version = 'v0' // Default "1".
            title = 'Core Registration API, Version V0' 
            description = 'API for Accessing secured resources'
            contact = 'testtest@mailinator.com'
            license = ''
            licenseUrl = ''
        }

        corsFilter(CorsFilter)
    }

Added a Controller ApiDocController.groovy:

    package grails.rest.example.apidoc

    import grails.web.mapping.LinkGenerator

    class ApiDocController {
        LinkGenerator grailsLinkGenerator
        def apiDocService
        def index = {
            String basePath = grailsLinkGenerator.serverBaseURL
            render(view: 'index', model: [apiDocsPath: "${basePath}/api/swagger-json"])
            //render(view: 'index', model: [apiDocsPath: "localhost:8080/api/swagger-json"])
            //render(view: 'index', model: [apiDocsPath: "localhost:8080/dist/index.html"])

        }
        def swaggerJson = {
            render apiDocService.generateJSON()
        }
    }

Added a URLMapping for controller:

    "/api/info"(controller: 'ApiDoc')
    "/"(controller: 'Index')
    "500"(controller: 'InternalServerError')
    "404"(controller: 'NotFound')

Added a service ApiDocService.groovy:

    //package com.care.apidoc
    package grails.rest.example.apidoc

    import io.swagger.jaxrs.config.BeanConfig
    import grails.transaction.Transactional
    import io.swagger.util.Json

    @Transactional
    class ApiDocService {

        def swaggerConfig

        /*
         * generates SWAGGer JSON
         */
        def generateJSON() {

            String[] schemes = ["http"] as String[]
            swaggerConfig.setSchemes(schemes)
            swaggerConfig.setScan(true)
            def swagger = swaggerConfig.getSwagger()

            Json.mapper().writeValueAsString(swagger);
        }
    }

added Swagger-ui in src/main/webapp/dist folder

    with a working customised API URL "http://localhost:8080/api/orders" in index.html

added CorsFilter setting in src/main/groovy/CorsFilter.groovy

    import org.springframework.web.filter.OncePerRequestFilter
    import javax.annotation.Priority
    import javax.servlet.FilterChain
    import javax.servlet.ServletException
    import javax.servlet.http.HttpServletRequest
    import javax.servlet.http.HttpServletResponse

    @Priority(Integer.MIN_VALUE)
    public class CorsFilter extends OncePerRequestFilter {

        public CorsFilter() { }

        @Override
        protected void doFilterInternal(HttpServletRequest req, HttpServletResponse resp, FilterChain chain)
        throws ServletException, IOException {

            String origin = req.getHeader("Origin");

            boolean options = "OPTIONS".equals(req.getMethod());
            resp.addHeader("Access-Control-Allow-Headers", "origin, authorization, accept, content-type, x-requested-with");
            resp.addHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS");
            resp.addHeader("Access-Control-Max-Age", "3600");

            resp.addHeader("Access-Control-Allow-Origin", origin == null ? "*" : origin);
            resp.addHeader("Access-Control-Allow-Credentials", "true");

            if (!options) chain.doFilter(req, resp);
        }
    }

On starting the server. API for orders is working correctly, however, when I try to load the API in Swagger UI index file. it shows. No operations defined in spec!

as attached in a pics.

回答1:

Have you looked at springfox?

Here is a sample Grails Application hosted in Heroku that demonstrates the capabilities of springfox integrating with it to produce the service description in the Open API specification 2.0 (fka swagger). The source code for the demo is available here.

You can see this demo running live here demonstrating the Open API specification generated by the grails application and rendered using swagger-ui.

The library that makes this possible is springfox-grails-integration library. It is about to be released and probably needs a little bit of work to make it a grails plugin. There is some preliminary documentation of how to configure this the library repository.

NOTE: This only works with grails 3.x

Also it was a notable library showcased in the SHOW US YOUR GRAILS contest. Feedback to improve this library is much appreciated.