2015-04-16 18 views
7

Come posso definire un map con le chiavi arbitrarie in un modello SwaggerCome posso definire una mappa con le chiavi arbitrarie in un modello Swagger

Dire che ho il seguente modello internazionalizzato (in pseudocodice stile Ruby, ipotizzando l'uso di qualcosa di simile Globalize)

class Thingy 
    translates :name 
    attribute :code 
end 

e il mio API vuole essere in grado di restituire qualcosa come

{ 
    "thingy": { 
    "code": "barn", 
    "translations": { 
     "default": "barn", 
     "en": "barn", 
     "ru": "cарай", 
     "fr": "grange", 
     "nl": "schuur" 
    } 
    } 
} 

ma io non voglio ri rigorosa la gamma di chiavi di traduzione nelle API attuale

posso definire nella mia spavalderia doc

definitions: 
    thingy: 
    required: 
     - code 
    properties: 
     code: 
     type: string 
    additionalProperties: 
     translations: 
     required: 
      - default 
     property: 
      default: 
      type: string 
     additonalProperties: string 

che convalida ma lo Swagger Codegen non genererà nulla fuori dal additionalProperties e non è molto esplicita rispetto a qualche modo essere in grado di definire un tipo map con un mix di chiavi obbligatorie e arbitrarie.

Chiunque lavori con l'internazionalizzazione si troverà ad affrontare problemi simili, quindi la mia domanda è: come hanno gestito altre persone questo scenario?

risposta

8

questo funziona sotto spavalderia-codegen-2.1.1-M1 (Java/JavaJaxRS) ... con i suggerimenti di Ron ...

Il YAML ...

translation: 
    required: 
    - default 
    properties: 
    default: 
     type: string 
    additionalProperties: 
    type: string 

thingy: 
    required: 
    - code 
    properties: 
    code: 
     type: string 
    translations: 
     $ref: '#/definitions/translation' 

crea una mappa con un attributo di 'default' ...

public class Translation extends HashMap<String, String> { 

    /** 
    * 
    */ 
    @Expose 
    private String _default = null; 

    /** 
    * @return _default the _default 
    */ 
    public String getDefault() { 
     return _default; 
    } 

    /** 
    * @param _default to set 
    */ 
    public void setDefault(String _default) { 
     this._default = _default; 
    } 

} 

che a sua volta incorporato in un Thingy .....

public class Thingy { 

    /** 
    * 
    */ 
    @Expose 
    private String code = null; 

    /** 
    * 
    */ 
    @Expose 
    private Translation translations = null; 

    /** 
    * @return code the code 
    */ 
    public String getCode() { 
     return code; 
    } 

    /** 
    * @param code to set 
    */ 
    public void setCode(String code) { 
     this.code = code; 
    } 

    /** 
    * @return translations the Translations 
    */ 
    public Translation getTranslations() { 
     return translations; 
    } 

    /** 
    * @param translations the Translations to set 
    */ 
    public void setTranslations(Translation translations) { 
     this.translations = translations; 
    } 

} 
+0

Questo è esattamente quello che ho finito - grazie a Ron e tu per il tuo aiuto. –

1

Mentre la definizione di cui sopra è teoricamente valida, non si traduce in ciò che si sta tentando di descrivere, né è realmente supportata da Swagger.

Al fine di descrivere la struttura che si desidera, si avrebbe bisogno la seguente definizione:

thingy: 
    type: object 
    required: 
    - code 
    properties: 
    code: 
     type: string 
    translations: 
     type: object 
     required: 
      - default 
     properties: 
      default: 
      type: string 
     additonalProperties: 
      type: string 

Mentre è possibile definire la linea dell'oggetto interno come sopra, mi raccomando si esternare la definizione e utilizzare $ref per fare riferimento alla definizione translations.

Per quanto riguarda il generatore di codice, il supporto per le mappe è stato introdotto di recente, quindi dovrebbe funzionare. Se si trova che non è così, si prega di aprire un problema direttamente sul progetto contenente una definizione Swagger di esempio per aiutare con il debug.

+0

Grazie Ron, è utile. Mi sono ampliato un po 'tenendo in considerazione i tuoi suggerimenti - guarda gist su https://gist.github.com/davesag/c8cf393f1a14d4df757e –

+0

Aggiunto un commento lì. – Ron