Swagger-core: Wie füge ich einen ModelConverter in einem Spring-Projekt hinzu?

Erstellt am 29. Okt. 2015  ·  4Kommentare  ·  Quelle: swagger-api/swagger-core

Ich habe ein Projekt mit Spring MVC und Spring Boot.
Ich verwende Swagger Springfox, um meinen JSON-Dienst zu dokumentieren. Ich habe eine Klasse mit den Attributen java.sql.Time und java.util.Date.
Wenn ich die API aufrufe, sieht die Klasse so aus:

"TranslationLabel":{
    "properties":{
        "change_date":{
            "type":"string",
            "format":"date-time"
        },
        "change_time":{
            "$ref":"#/definitions/Time"
        }
    },
    "description":"Traduction de libellé"
}

In der Swagger-Benutzeroberfläche sieht das Modellschema so aus:

 {
  "change_date": "2015-10-29",
  "change_time": {
    "date": 0,
    "day": 0,
    "hours": 0,
    "minutes": 0,
    "month": 0,
    "seconds": 0,
    "time": 0,
    "timezoneOffset": 0,
    "year": 0
  }
}

Ich möchte die "change_time" wie "15:31" anzeigen.
Dazu muss ich, glaube ich, einen ModelConverter verwenden. Also erstelle ich eine benutzerdefinierte Konverterklasse basierend auf diesem Beispiel: https://github.com/swagger-api/swagger-core/blob/master/modules/swagger-core/src/test/java/io/swagger/model/ override/CustomConverterTest.java
Aber ich finde nicht, wie man es benutzt.

Hier ist meine Klasse:

class CustomConverter implements ModelConverter {
    <strong i="18">@Override</strong>
    public Property resolveProperty(Type type, ModelConverterContext context, Annotation[] annotations,
                                    Iterator<ModelConverter> chain) {
        final JavaType jType = Json.mapper().constructType(type);
        if (jType != null) {
            final Class<?> cls = jType.getRawClass();
            if (cls.equals(Time.class)) {
                HashMap<PropertyBuilder.PropertyId, Object> map =
                        new HashMap<>();
                map.put(PropertyBuilder.PropertyId.FORMAT,"HH:mm");
                map.put(PropertyBuilder.PropertyId.TYPE,"time");
                map.put(PropertyBuilder.PropertyId.EXAMPLE,"12:30");
                return PropertyBuilder.build("Time", "hh:mm", map);
            } else {
                return chain.next().resolveProperty(type, context, annotations, chain);
            }
        } else {
            return null;
        }
    }

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

Jetzt muss ich meinen Konverter zu den ModelConverters hinzufügen.

ModelConverters converters = new ModelConverters();
converters.addConverter(new CustomConverter());

Ich habe keine Dokumentation darüber gefunden, wo dieser Code eingefügt werden soll.
Wo musste ich das hinstellen?

Support

Hilfreichster Kommentar

Springfox hat einen anderen Weg, dies zu erreichen. Sie müssen Docket.directmodelSubstitute(Time.class, String.class) verwenden, um einen äquivalenten Konverter zu definieren. Es unterstützt jedoch keine Beispiele usw.

Alle 4 Kommentare

Springfox hat einen anderen Weg, dies zu erreichen. Sie müssen Docket.directmodelSubstitute(Time.class, String.class) verwenden, um einen äquivalenten Konverter zu definieren. Es unterstützt jedoch keine Beispiele usw.

Danke für deine Antwort.
Ich versuche Ihre Lösung, aber damit wird "change_time":"string" anstelle von "change_time":"hh:mm" angezeigt.
Ist es möglich, ein Format für den String anzugeben?

Hallo Leute,

Ich habe ein Problem mit ModelConverters. My Swagger.json enthält eine generische Klasse in der erweiterten Form wie unten:

"JsonNode": {
"Typ": "Objekt",
"Eigenschaften": {
"floatingPointNumber": {
"typ": "boolesch",
"Standard": falsch
},
"WertKnoten": {
"typ": "boolesch",
"Standard": falsch
},
"große Ganzzahl": {
"typ": "boolesch",
"Standard": falsch
},
"Text": {
"typ": "boolesch",
"Standard": falsch
},
"boolean": {
"typ": "boolesch",
"Standard": falsch
},
"ContainerKnoten": {
"typ": "boolesch",
"Standard": falsch
},
"fehlender Knoten": {
"typ": "boolesch",
"Standard": falsch
},
"Objekt": {
"typ": "boolesch",
"Standard": falsch
},
"pojo": {
"typ": "boolesch",
"Standard": falsch
},
"Anzahl": {
"typ": "boolesch",
"Standard": falsch
},
"Integralzahl": {
"typ": "boolesch",
"Standard": falsch
},
"kurz": {
"typ": "boolesch",
"Standard": falsch
},
"int": {
"typ": "boolesch",
"Standard": falsch
},
"lang": {
"typ": "boolesch",
"Standard": falsch
},
"doppelt": {
"typ": "boolesch",
"Standard": falsch
},
"bigDecimal": {
"typ": "boolesch",
"Standard": falsch
},
"schweben": {
"typ": "boolesch",
"Standard": falsch
},
"Knotentyp": {
"Typ": "Zeichenfolge",
"enum": [
"ARRAY",
"BINÄR",
"BOOLEAN",
"FEHLEN",
"NULL",
"ANZAHL",
"OBJEKT",
"POJO",
"STRING"
]
},
"binär": {
"typ": "boolesch",
"Standard": falsch
},
"Array": {
"typ": "boolesch",
"Standard": falsch
},
"Null": {
"typ": "boolesch",
"Standard": falsch
}
}
}

Das ist jetzt definitiv das, was ich nicht will. Tatsächlich möchte ich verhindern, dass diese bestimmte Klasse (com.fasterxml.jackson.databind.JsonNode) (und jede andere meiner Wahl) jemals erweitert wird. Um dies zu tun, habe ich die eingebaute Funktion verwendet, die in der unten gezeigten Klasse io.swagger.converter.ModelConverters bereitgestellt wird:

public void addClassToSkip(String cls) {
LOGGER.warn("Klasse überspringen" + cls);
this.skippedClasses.add (cls);
}

Nachdem ich dies getan habe, kann ich anscheinend nicht herausfinden, wo ich die ModelConverters-Klasse tatsächlich einfügen soll, da ich versucht habe, sie zusammen mit anderen zur Liste der Anbieter hinzuzufügen, aber ohne Ergebnis. Kann mir bitte jemand dabei helfen. Ich suche jetzt seit fast 3 Tagen nach der Antwort.

Verwenden Sie einen benutzerdefinierten Konverter, dies ist laut meiner Analyse ein Fehler. Sie können ModelResolver in Ihren eigenen Code kopieren und so etwas tun.

ModelConverters.getInstance().addConverter(new ModelResolver(mapper));

Ändern Sie weiter im ModelResolver die folgende Auflösungsmethode

private Model resolve(JavaType type, ModelConverterContext context, Iterator<ModelConverter> next) {
        if (type.isEnumType() || PrimitiveType.fromType(type) != null) {
            // We don't build models for primitive types
            return null;
        }

        if (type instanceof SimpleType && ((SimpleType) type).getRawClass().getName().startsWith("your classname")) {
            return yourConverter.resolve(type, context, next);
        }

Es ist ein Hack, das Problem ist dasselbe wie https://github.com/swagger-api/swagger-core/issues/2260

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen