2015-04-16 10 views
7

Jak mogę zdefiniować map z dowolnych klawiszy w modelu SwaggerJak mogę określić mapę z dowolnych klawiszy w modelu Swagger

że mam następujący umiędzynarodowionego modelu (w Ruby stylu Pseudokod, zakładając wykorzystanie coś Globalize)

class Thingy 
    translates :name 
    attribute :code 
end 

i mój API chce być w stanie powrócić coś jak

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

ale nie chcę, aby ponownie ścisły zakres kluczy tłumaczeniowych w rzeczywistej API

mogę określić w moim Swagger doc

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

To potwierdza, ale z Swagger Codegen nic poza additionalProperties nie wygeneruje i to nie jest bardzo wyraźny w porównaniu jakoś możliwość zdefiniowania typu map z kombinacją wymaganych i arbitralnych kluczy.

Każdy, kto pracuje z internacjonalizacją, będzie musiał stawić czoła podobnym problemom, więc moje pytanie brzmi: jak inni radzili sobie z tym scenariuszem?

Odpowiedz

8

Działa pod Swagger-Codegen-2.1.1-M1 (Java/JavaJaxRS) ... z sugestiami Rona ...

YAML ...

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

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

tworzy się mapa z a 'default' atrybut ...

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

} 

który z kolei jest osadzone w rodzaju lasera .....

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

Dokładnie to osiągnąłem - dzięki Ronowi i Tobie za pomoc. –

1

Chociaż powyższa definicja jest teoretycznie poprawna, nie oznacza to, co próbujesz opisać, ani nie jest obsługiwana przez Swagger.

W celu opisania struktury chcesz, to trzeba następującą definicję:

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

Podczas może zdefiniowania obiektu wewnętrznego inline jak wyżej, Goraco polecam uzewnętrznić definicji i użyj $ref, aby odwołać się do niego z definicji translations.

Co do generatora kodu, obsługa map została ostatnio wprowadzona, więc powinna działać. Jeśli okaże się, że tak nie jest, należy otworzyć problem bezpośrednio w projekcie zawierającym przykładową definicję Swagger, aby pomóc w debugowaniu.

+0

Dzięki Ron, to jest pomocne. Rozbudowałem to nieco biorąc pod uwagę twoje sugestie - patrz sedno na https://gist.github.com/davesag/c8cf393f1a14d4df757e –

+0

Dodałem tam komentarz. – Ron

Powiązane problemy