swagger
stub

Swagger Code Generator (swagger-codegen) の server stub の レスポンスが empty object になるのなんで?

More than 1 year has passed since last update.


概要

swagger-codegen の server stub を使ってるんだけど、

ちょっと複雑な定義をすると、どうもレスポンスが empty object {} になってしまう。

下記の記事もあるので、自分だけの問題ではない様子。

swagger スタブのresponseが空になる問題調査メモ - Qiita

これはいったいなんなんだという調査メモ。

間違ってたらツッコミお願いします。


調査結果まとめ



  • $ref の参照先が下記だとダメ


    • "type": "array"

    • $ref

    • allOf




調査メモ


ExampleGenerator

swagger-codegen/ExampleGenerator.java

こやつが example の値を生成しているようなので、こやつを見ていく。

自分の場合は、 $ref を多用していたので下記の箇所に処理が走っていた。


        } else if (property instanceof RefProperty) {

String simpleName = ((RefProperty) property).getSimpleRef();
logger.debug("Ref property, simple name: {}", simpleName);
Model model = examples.get(simpleName);
if (model != null) {
return resolveModelToExample(simpleName, mediaType, model, processedModels);
}
logger.warn("Ref property with empty model.");

https://github.com/swagger-api/swagger-codegen/blob/049b1b2bcc904e1179a0e9b11124ed8fa0e3be2e/modules/swagger-codegen/src/main/java/io/swagger/codegen/examples/ExampleGenerator.java#L176-L183


で下記の model instanceof ModelImpl この条件に当てはまらず、空になっていた模様。


    private Object resolveModelToExample(String name, String mediaType, Model model, Set<String> processedModels) {

if (processedModels.contains(name)) {
return "";
}
if (model instanceof ModelImpl) {
processedModels.add(name);
ModelImpl impl = (ModelImpl) model;
Map<String, Object> values = new HashMap<>();
logger.debug("Resolving model '{}' to example", name);
if (impl.getExample() != null) {
logger.debug("Using example from spec: {}", impl.getExample());
return impl.getExample();
} else if (impl.getProperties() != null) {
logger.debug("Creating example from model values");
for (String propertyName : impl.getProperties().keySet()) {
Property property = impl.getProperties().get(propertyName);
values.put(propertyName, resolvePropertyToExample(mediaType, property, processedModels));
}
}
return values;
}
return "";

https://github.com/swagger-api/swagger-codegen/blob/049b1b2bcc904e1179a0e9b11124ed8fa0e3be2e/modules/swagger-codegen/src/main/java/io/swagger/codegen/examples/ExampleGenerator.java#L204-L228


じゃあこの時の model は何のインスタンスになってたか調べたら io.swagger.models.ComposedModel になっていた。

まぁだから $ref の参照先が ComposedModel だとダメらしい。


ComposedModel はなんじゃらほい

https://github.com/swagger-api/swagger-parser/blob/f9c9498fddafb18dcfc42d373a158ae8caf095a7/modules/swagger-parser/src/main/java/io/swagger/parser/util/SwaggerDeserializer.java#L881 を見る限り、 allOf を使ったやつだと思う。

あとさきのソースコードを見ると、

ModelImpl 以外に RefModel, ArrayModel も返すので、ココらへんのやつだとやっぱり empty object になってしまうっぽい。