如何在 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中翻译键的范围
我可以在我的 swagger 文档中定义
definitions:
thingy:
required:
- code
properties:
code:
type: string
additionalProperties:
translations:
required:
- default
property:
default:
type: string
additonalProperties: string
这可以验证,但 Swagger Codegen 不会生成
additionalProperties
之外的任何内容,并且与能够以某种方式混合所需键和任意键来定义 map
类型相比,它不是很明确。
任何从事国际化工作的人都会面临类似的问题,所以我的问题是,其他人是如何处理这种情况的?
这适用于 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;
}
}
虽然上面的定义在理论上是有效的,但它并不能转化为您想要描述的内容,也不受 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 定义以帮助调试。