2016-06-01 8 views
0

Ich weiß aus the documentation, dass ich meine POJOs wie diese mit Anmerkungen versehen kann:Wie Swagger Enum durch einen Link zu einer Ressource zu ersetzen?

nun die Methode
"properties": { 
     ..., 
     "status": { 
      "type": "string", 
      "description": "pet status in the store", 
      "enum": [ 
      "available", 
      "pending", 
      "sold" 
      ] 
     } 
     } 

Bild zu implementieren:

@ApiModelProperty(value = "pet status in the store", allowableValues = "available,pending,sold") 
public String getStatus() { 
    return status; 
    } 

wie etwas zu produzieren

@ApiModelProperty(value = "pets in the store") 
public Set<String> getPets() { 
    return pets; 
    } 

die zurück eine Liste der im Laden verfügbaren Haustiere. Zum Beispiel könnte es eines Tages ["cats", "dogs", "songbirds"] und dann nur ["cats", "dogs"] sein, wenn die Singvögel ausverkauft sind.

Meine API würde in der Tat einen Endpunkt hat, um die Liste von Haustieren zu holen:

http://petShop.foo/pets

Statt allowableValues = "cats, dogs, songbirds" der Verwendung ich mit einer Swagger Anmerkung angeben mag, dass das Feld a enthalten muss Wert, der vom angegebenen Endpunkt zurückgegeben wird. Das heißt, so etwas wie:

@ApiModelProperty(value = "pets in the store", allowableValues = "/pets") 
public Set<String> getPets() {...} 

dies, um meinen Client/Front-End zu ermöglichen, zu wissen, welche Werte Nutzen sein können, wenn eine Anfrage an machen, zum Beispiel ein Haustier kaufen online. Genau wie ich es könnte, wenn ich "enum": ["cats", "dogs", ..] hätte

Antwort

0

Eine Java-Annotation ist eine syntaktische Metadaten. Es wird während der Kompilierung verarbeitet und (wenn es @Retention(RetentionPolicy.RUNTIME) angegeben ist) ist während der Laufzeit für reflektiven Zugriff verfügbar. Daher gibt es keine direkte Möglichkeit zur Lösung oder Einstellung während der Laufzeit!

Es gibt jedoch einen Weg in Java, um zu erreichen, was Sie wollen - aber es ist ein bisschen zu komplex (und verwendet einige undokumentierte Funktionen!). Hier ist, wie:

  • Erstellen Sie eine benutzerdefinierte Anmerkung ApiModelProperty (eins mit @Retention(RetentionPolicy.COMPILE)) - das als Wrapper handeln würde für @ApiModelProperty
  • schreiben eine Anmerkung Prozessorklasse für über Annotation (es muss von javax.annotation.processing.AbstractProcessor Klasse erweitern)
  • In Annotations-Prozessor, inject@ApiModelProperty mit Werten wie von Ihrem Enum lesen (dieser Teil ist ziemlich komplex, wie Sie durch das AST von Enum müssen durchqueren erlaubte Werte zu erhalten)

Project Lombok ist ein gutes Beispiel. Es manipuliert Javas Abstract Syntax Tree, um neue Features in Java hinzuzufügen.

In it's source code unter lombok.javac.handlers, werfen Sie einen Blick auf:

  • HandleConstructor.addConstructorProperties Methode zu verstehen, wie Anmerkungen in der Kompilierung hinzuzufügen. (mit com.sun.tools.javac.tree.JCAnnotation)
  • HandleVal.visitLocal Methode zu verstehen, wie zu lesen Literal Werte.

Sie können auch einen Blick auf dieses Tutorial nehmen: Creating Custom Transformations

+0

Ich muss die Annotation zur Laufzeit nicht auflösen: Ich möchte lieber, dass Swagger eine Annotation liest, die eine Endpunktadresse enthält, von der die Clients den möglichen Wert für ein Feld abrufen können. Wenn ich das richtig verstehe, ist Ihr Ansatz der Versuch, die Enumerationsliste zur Laufzeit zu generieren. Obwohl es interessant ist, ist es nicht genau das, was ich brauche (mindestens so komplex wie eine neue Swagger Annotation, um 2- zu implementieren, was ist mit der statischen Version des swagger.json Schemas?). –

+0

@ Niccolò "Ihr Ansatz, wenn ich richtig verstehe, ist ein Versuch, die Enumerationsliste zur Laufzeit zu generieren". Der von mir vorgeschlagene Ansatz generiert 'compiledValues' zur Kompilierzeit, nicht zur Laufzeit. –

2

Sie können wie folgt vorgehen:

  • Fork Swagger
  • Extend Methode processAllowedValues in io.swagger.util.ParameterProcessor Klasse eine Enum-Klasse verbrauchen in zusätzlich zu kommagetrennten Werten. (Zur Zeit nur durch Komma getrennte Werte und Bereich unterstützt)
  • Verwenden Sie Ihre individuelle Variante Swagger, während Ihre Anwendung Web-Aufbau

jedoch mit dieser Methode, werden Sie weiterhin benötigen, um Ihre Gabel von Swagger zu halten.

+0

Das hat mein Problem nicht gelöst, jedoch +1 für die Mühe. Es sieht so aus, als ob Swagger derzeit nicht unterstützt, was ich brauche. Swagger zu forkieren wäre eine Lösung, mit dem Nachteil, den Sie erklärt haben. –

+0

@ Niccolò Ihr ist kein "Problem", es ist ein "Feature Ask": D –

+0

Das stimmt! Als ich die Frage schrieb, dachte ich immer noch, ich hätte etwas in der Dokumentation verpasst. –