如何在Swagger模型中使用任意键定义map
假设我有以下国际化模型(在Ruby风格的伪代码中,假设使用Globalize
之类的东西)
class Thingy
translates :name
attribute :code
end
我的API希望能够返回类似
的内容{
"thingy": {
"code": "barn",
"translations": {
"default": "barn",
"en": "barn",
"ru": "cарай",
"fr": "grange",
"nl": "schuur"
}
}
}
但我不想限制实际API中的翻译键范围
我可以在我的招摇文档中定义
definitions:
thingy:
required:
- code
properties:
code:
type: string
additionalProperties:
translations:
required:
- default
property:
default:
type: string
additonalProperties: string
验证但是Swagger Codegen不会在additionalProperties
之外生成任何内容,并且与以某种方式能够定义具有所需和任意键的混合的map
类型相比,它不是非常明确的。 / p>
任何从事国际化工作的人都会面临类似的问题,所以我的问题是,其他人如何处理这种情况呢?
答案 0 :(得分:9)
这可以在swagger-codegen-2.1.1-M1(Java / JavaJaxRS)下工作......以及Ron的建议......
YAML ......
translation:
required:
- default
properties:
default:
type: string
additionalProperties:
type: string
thingy:
required:
- code
properties:
code:
type: string
translations:
$ref: '#/definitions/translation'
使用'默认'创建地图。属性......
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;
}
}
反过来又嵌入了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;
}
}
答案 1 :(得分:2)
虽然上面的定义在理论上是有效的,但它并不会转化为您尝试描述的内容,也不会真正支持Swagger。
为了描述您想要的结构,您需要以下定义:
thingy:
type: object
required:
- code
properties:
code:
type: string
translations:
type: object
required:
- default
properties:
default:
type: string
additonalProperties:
type: string
虽然您可以如上所述内联定义内部对象,但我强烈建议您将定义外部化并使用$ref
从translations
定义引用它
至于代码生成器,最近已经引入了对地图的支持,因此它应该可以工作。如果您发现它没有,请直接在包含示例Swagger定义的项目上打开一个问题,以帮助调试。