Swagger-core: Comment ajouter un ModelConverter dans un projet Spring ?

Créé le 29 oct. 2015  ·  4Commentaires  ·  Source: swagger-api/swagger-core

J'ai un projet avec Spring MVC et Spring boot.
J'utilise Swagger springfox pour documenter mon service json. J'ai une classe avec les attributs java.sql.Time et java.util.Date.
Lorsque j'appelle l'api, la classe apparaît comme ceci :

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

Dans l'interface utilisateur swagger, le schéma du modèle ressemble à ceci :

 {
  "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
  }
}

Je veux afficher le "change_time" comme "15:31".
Pour ce faire, je pense que je dois utiliser un ModelConverter. Je crée donc une classe de convertisseur personnalisée basée sur cet exemple : https://github.com/swagger-api/swagger-core/blob/master/modules/swagger-core/src/test/java/io/swagger/model/ remplacer/CustomConverterTest.java
Mais je ne trouve pas comment l'utiliser.

Voici ma classe :

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);
    }
}

Maintenant, je dois ajouter mon convertisseur aux ModelConverters.

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

Je n'ai trouvé aucune documentation sur l'endroit où mettre ce code.
Où ai-je besoin de mettre ça ?

Support

Commentaire le plus utile

Springfox a une manière différente d'y parvenir. Vous devez utiliser le Docket.directmodelSubstitute(Time.class, String.class) pour définir un convertisseur équivalent. Cependant, il ne prend pas en charge les exemples, etc.

Tous les 4 commentaires

Springfox a une manière différente d'y parvenir. Vous devez utiliser le Docket.directmodelSubstitute(Time.class, String.class) pour définir un convertisseur équivalent. Cependant, il ne prend pas en charge les exemples, etc.

Merci pour votre réponse.
J'essaie votre solution mais avec cela, elle affiche "change_time":"string" au lieu de "change_time":"hh:mm".
Est-il possible de spécifier un format pour la chaîne ?

Salut les gars,

J'ai un problème lié à ModelConverters. Mon Swagger.json contient une classe générique sous la forme développée comme ci-dessous :

"JsonNode": {
"type": "objet",
"Propriétés": {
"floatingPointNumber": {
"type": "booléen",
"par défaut": faux
},
"noeudvaleur": {
"type": "booléen",
"par défaut": faux
},
"grosEntier": {
"type": "booléen",
"par défaut": faux
},
"textuel": {
"type": "booléen",
"par défaut": faux
},
"booléen": {
"type": "booléen",
"par défaut": faux
},
"noeud de conteneur": {
"type": "booléen",
"par défaut": faux
},
"missingNode": {
"type": "booléen",
"par défaut": faux
},
"objet": {
"type": "booléen",
"par défaut": faux
},
"pojo": {
"type": "booléen",
"par défaut": faux
},
"numéro": {
"type": "booléen",
"par défaut": faux
},
"nombreintégral": {
"type": "booléen",
"par défaut": faux
},
"court": {
"type": "booléen",
"par défaut": faux
},
"int": {
"type": "booléen",
"par défaut": faux
},
"long": {
"type": "booléen",
"par défaut": faux
},
"double": {
"type": "booléen",
"par défaut": faux
},
"grosdécimal": {
"type": "booléen",
"par défaut": faux
},
"flotter": {
"type": "booléen",
"par défaut": faux
},
"nodeType": {
"type": "chaîne",
"énumération": [
"DÉPLOYER",
"BINAIRE",
"BOOLÉEN",
"DISPARU",
"NUL",
"NUMÉRO",
"OBJET",
"POJO",
"CHAÎNE DE CARACTÈRES"
]
},
"binaire": {
"type": "booléen",
"par défaut": faux
},
"déployer": {
"type": "booléen",
"par défaut": faux
},
"nul": {
"type": "booléen",
"par défaut": faux
}
}
}

Maintenant, c'est définitivement ce que je ne veux pas. En fait, ce que je veux, c'est empêcher que cette classe spécifique (com.fasterxml.jackson.databind.JsonNode) (et toute autre de mon choix) ne soit jamais étendue. Donc, pour ce faire, j'ai utilisé la fonction intégrée fournie dans la classe io.swagger.converter.ModelConverters illustrée ci-dessous :

public void addClassToSkip(String cls) {
LOGGER.warn("saut de classe " + cls);
this.skippedClasses.add(cls);
}

Maintenant que j'ai fait cela, je n'arrive pas à savoir où injecter réellement la classe ModelConverters, car j'ai essayé de l'ajouter à la liste des fournisseurs avec d'autres, mais sans résultat. Quelqu'un pourrait m'aider avec ça. Je cherche la réponse depuis presque 3 jours maintenant.

Utilisez un convertisseur personnalisé, c'est un bogue selon mon analyse, vous pouvez copier ModelResolver dans votre propre code et faire quelque chose comme ça.

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

Plus loin dans le ModelResolver, modifiez la méthode de résolution suivante

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);
        }

C'est un hack, le problème est le même que https://github.com/swagger-api/swagger-core/issues/2260

Cette page vous a été utile?
0 / 5 - 0 notes