Swagger-core: In der Dokumentation zu Version 1.5.0 und im Migrationshandbuch zu 1.3 > 1.5 fehlen Informationen zum Überschreiben des Modells

Erstellt am 15. Juni 2015  ·  5Kommentare  ·  Quelle: swagger-api/swagger-core

Derzeit gibt es keine Dokumentation zum empfohlenen Ansatz zum Überschreiben des Datenmodells und Konfigurieren der benutzerdefinierten Typauflösung. Wo swagger 1.3 einige Informationen zu verschiedenen Lösungen gab, z. B. durch Hinzufügen einer OverrideConverter-Instanz zu ModelConverters, und sogar einige Konverter für die am häufigsten verwendeten JodaTime-Typen zur Auflösung in JSON "string : date(-time)" einfügte, gibt es nichts in die 1.5 docs oder den Migrationsleitfaden.

In Ihrem Community-Forum hat mich Ron/webron freundlicherweise auf die ModelConverter-Testfälle in swagger-core hingewiesen. Ich denke, es wäre hilfreich, diesen Ansatz zu dokumentieren.

Gruß, Andreas

Documentation

Hilfreichster Kommentar

Leider ist dies nicht genau das, was der OverrideConverter bereitgestellt hat:

OverrideConverter converter = new OverrideConverter();
converter.add(className, json);

Die Eigenschaft wurde mithilfe einer JSON-Definition erstellt. Auf diese Weise war es auch möglich, die Eigenschaften als Ressourcendatei zu konfigurieren.

Die zusätzliche Frage lautet also: Wie erstelle ich eine Eigenschaft, indem ich eine JSON-Eigenschaftsdefinition analysiere?

Alle 5 Kommentare

Ich habe einige Probleme, die Testfälle zu begreifen. Würden Sie einen Überblick über Ihren JodaTime-Konverter geben?

Klar, keine Sorge.

In unserem Swagger-Konfigurationscode registriere ich unseren CustomModelConverter:

ModelConverters.getInstance().addConverter(new CustomModelConverter());

Der Konverter und die referenzierten Typen sind wie folgt:

public class CustomModelConverter implements ModelConverter {

    <strong i="10">@Override</strong>
    public Property resolveProperty(Type type, ModelConverterContext context, Annotation[] annotations, Iterator<ModelConverter> chain) {
        JavaType _type = Json.mapper().constructType(type);
        if (_type != null) {
            Class<?> cls = _type.getRawClass();
            if (DateTime.class.isAssignableFrom(cls)) {
                return new ISODateTimeProperty();
            }
            if (LocalDate.class.isAssignableFrom(cls)) {
                return new ISODateProperty();
            }
            if (LocalTime.class.isAssignableFrom(cls)) {
                return new ISOTimeProperty();
            }
            if (Currency.class.isAssignableFrom(cls)) {
                return new CurrencyProperty();
            }
            if(Throwable.class.equals(cls)) {
                return new io.swagger.models.properties.ObjectProperty();
            }
        }
        if (chain.hasNext()) {
            return chain.next().resolveProperty(type, context, annotations, chain);
        } else {
            return null;
        }
    }

    <strong i="11">@Override</strong>
    public Model resolve(Type type, ModelConverterContext context, Iterator<ModelConverter> chain) {
        if (chain.hasNext()) {
            return chain.next().resolve(type, context, chain);
        } else {
            return null;
        }
    }
}


public class CurrencyProperty extends AbstractProperty {
    public CurrencyProperty() {
        this.setType("string");
        this.setExample("AUD"); //ISO 4217 currency code
    }
}

public class ISOTimeProperty extends AbstractProperty {
    public ISOTimeProperty() {
        this.setType("string");
        this.setExample("23:59:59.999"); //time in ISO8601 format (HH:mm:ss.SSS)
    }
}

public class ISODateProperty extends AbstractProperty {
    public ISODateProperty() {
        this.setType("string");
        this.setFormat("date");
        this.setExample("1999-12-31"); //date in ISO8601 format (yyyy-MM-dd)
    }
}

public class ISODateTimeProperty extends AbstractProperty {
    public ISODateTimeProperty() {
        this.setType("string");
        this.setFormat("date-time");
        this.setExample("1999-12-31T23:59:59.999+11:00"); //date-time in ISO8601 format (yyyy-MM-ddTHH:mm:ss.SSSZZ)
    }
}

Mit diesem Ansatz werden Java Currency und die Joda-Typen DateTime, LocalDate und LocalTime mit dem gleichen Format dokumentiert, das wir in unserer Jersey-API verwenden (unter Verwendung von JAXB-Adaptern, die Währung dem 3-Buchstaben-ISO-Währungscode, LocalTime einem ISO-String usw. zuordnen)
Hinweis: Wir verwenden diesen benutzerdefinierten Konverter auch, um nicht anderweitig definierte Throwable-Typen als einfaches Objekt festzulegen, um zu verhindern, dass die geerbte Eigenschaft Throwable getSuppressed() (und damit StackTraceElement[] stackTrace ) der Exception-Unterklassentypen unserer Anwendung in unseren Swagger-Dokumenten auftauchen. Siehe: https://github.com/swagger-api/swagger-core/issues/1168

Leider ist dies nicht genau das, was der OverrideConverter bereitgestellt hat:

OverrideConverter converter = new OverrideConverter();
converter.add(className, json);

Die Eigenschaft wurde mithilfe einer JSON-Definition erstellt. Auf diese Weise war es auch möglich, die Eigenschaften als Ressourcendatei zu konfigurieren.

Die zusätzliche Frage lautet also: Wie erstelle ich eine Eigenschaft, indem ich eine JSON-Eigenschaftsdefinition analysiere?

@fehguy wurde das gelöst?

Nicht wirklich - Meine Frage oben ist noch offen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen