2016-09-21 8 views
8

Chcę używać kodowania swagger-codegen do generowania klientów REST i ewentualnie statycznej dokumentacji HTML.Jak wygenerować swagger.json przy użyciu gradle?

Jednak kodek typu swagger potrzebuje swagger.json do wprowadzania danych.

Jestem świadomy, że mogę to uzyskać z działającego serwera REST wyposażonego w Swagger.

Ale czy istnieje sposób na uzyskanie pliku swagger.json bezpośrednio z mojego kodu Java - tj. Wygenerowanie go z gradle z kodu źródłowego - bez potrzeby uruchamiania aplikacji w kontenerze WWW i wskazywania curl lub przeglądarki do to?

+0

Nadal się nad tym zastanawiam. – tbsalling

+0

https://github.com/gigaSproule/swagger-gradle-plugin Czy wypróbowałeś tę wtyczkę? To twierdzi, że robi dokładnie to, o co prosisz. –

+0

Korzystając z wtyczki typu "swagger-gradle", pojawia się następujący błąd: com.fasterxml.jackson.databind.JsonMappingException: Brak treści do odwzorowania ze względu na koniec wprowadzania w [Źródło: NIEZNANE; linia: 1, kolumna: 0] – lex

Odpowiedz

1

Głównym pomysłem jest dodanie Swagger-maven-plugin i swoich klas Javy do ścieżki klasy dla buildScript aby móc je wykorzystać w Gradle, coś takiego:

buildscript { 
    repositories { 
     mavenCentral() 
    } 

    dependencies { 
     classpath files(project(':swagger-maven-example').configurations['runtime'].files) 
     classpath files(project(':swagger-maven-example').sourceSets['main'].output.classesDir) 
    } 
} 

gdzie pierwsza linia w zależności pobierają bibliotekę poboczną z projektu podrzędnego, a druga linia pobiera klasy, które powinny zawierać adnotacje typu "swagger".

Po tym można powołać plugin maven w Gradle jako prosty klasy Java:

// a trick to have all needed classes in the classpath 
def customClass = new GroovyClassLoader() 

buildscript.configurations.classpath.each { 
    // println it.toURI().toURL() 
    customClass.addURL(it.toURI().toURL()) 
} 

final ApiDocumentMojo mavenTask = Class.forName('com.github.kongchen.swagger.docgen.mavenplugin.ApiDocumentMojo',true, customClass).newInstance(
     apiSources: [ 
       new ApiSource(
         springmvc: false, 
         locations: ['com/github/kongchen/swagger/sample/wordnik/resource'], 
         schemes: ['http', 'https'], 
         host: 'petstore.swagger.wordnik.com', 
         basePath: '/api', 
         info: new Info(
           title: 'Swagger Maven Plugin Sample', 
           version: 'v1', 
           description: 'This is a sample for swagger-maven-plugin', 
           termsOfService: 'http://www.github.com/kongchen/swagger-maven-plugin', 
           contact: new Contact(
             email: '[email protected]', 
             name: 'Kong Chen', 
             url: 'http://kongch.com' 
           ), 
           license: new License(
             url: 'http://www.apache.org/licenses/LICENSE-2.0.html', 
             name: 'Apache 2.0' 
           ) 
         ), 
         outputPath: file("${buildDir}/swagger/document.html").path, 
         swaggerDirectory: file("${buildDir}/swagger/swagger-ui").path, 
         templatePath: file("${project(':swagger-maven-example').projectDir}/templates/strapdown.html.hbs") 
       ) 
     ] 
) 

// maven plugin 
mavenTask.execute() 

Here można znaleźć ten przykład.

2

To jest trochę stary, ale zastanawiałem się dokładnie to samo ... W skrócie ja rozpocząłem badania z:

  • app próbki Wiosna Boot narażając minimalistyczny REST API;
  • Adnotacje Swagger na metodach API;
  • Springfox;
  • Gradle jako narzędzie do kompilacji;

udało mi się wygenerować spec JSON jako artefakt zbudować używając dwóch różnych podejść:

  1. Przy użyciu gradle port z swagger-maven-plugin of kongchen.
  2. (Nie jestem pewien, czy to się liczy, ponieważ tak czy inaczej uruchamia serwer) Wykonując test integracji (Spring Mock MVC), który generuje specyfikację. Pożyczyłem pomysł od here.

Podsumowałem moje badania w prostym projekcie zlokalizowanym pod numerem here. Zobacz sekcję Automation. Kod i przykłady są uwzględnione.