読者です 読者をやめる 読者になる 読者になる

Play Framework 2.5.x (java) で Swagger 1.5.x を使う時に Ebean が _ebean_intercept を各モデルにつけてしまう問題の対処

Play Scala 2.2 + swagger 1.3.3 とかだと以下で対処できるようですが、タイトルの組み合わせではこのやり方は使えなかったので、試行錯誤の結果を残しておきます。

java - Swagger is showing _ebean_intercept with everymodel in my play application - Stack Overflow

import com.wordnik.swagger.converter.SwaggerSchemaConverter

class IgnoreConverter extends SwaggerSchemaConverter{
  override def skippedClasses: Set[String] = Set("com.avaje.ebean.bean.EntityBeanIntercept")
  override def ignoredClasses: Set[String] = Set("com.avaje.ebean.bean.EntityBeanIntercept")
  override def ignoredPackages: Set[String] = Set("com.avaje.ebean")
}
public class Global  extends GlobalSettings {
    @Override
    public void beforeStart(Application app) {
        Logger.info("Registering custom converter");
        ModelConverters.addConverter(new IgnoreConverter(), true);
    }
}

変更点

Play 2.5

GlobalSettings - 2.5.x - Play Framework

GlobalSettings が非推奨になりました。各クラスのコンストラクタで設定しましょう。

Swagger 1.5

Overriding Models · swagger-api/swagger-core Wiki

公式ドキュメントは現時点 (2017-04-10) で 1.3 系のままなので、テストクラスを参考にしてくれとのことみたいです。

How do you override models with swagger-core 1.5.3? · Issue #1499 · swagger-api/swagger-core

実装

public class IgnoreConverter implements ModelConverter {
  @Override
  public Property resolveProperty(Type type, ModelConverterContext context, Annotation[] annotations, Iterator<ModelConverter> chain) {
    JavaType _type = Json.mapper().constructType(type);
    if (_type != null) {
      Class<?> cls = _type.getRawClass();
      // Ebean class (_ebean_intercept)
      if (EntityBeanIntercept.class.isAssignableFrom(cls)) {
        return null;
      }
    }
    if (chain.hasNext()) {
      return chain.next().resolveProperty(type, context, annotations, chain);
    } else {
      return null;
    }
  }

  @Override
  public Model resolve(Type type, ModelConverterContext context, Iterator<ModelConverter> chain) {
    if (chain.hasNext()) {
      return chain.next().resolve(type, context, chain);
    } else {
      return null;
    }
  }
}
@Api
public class HomeController extends Controller {

  @Inject
  public HomeController(MessagesApi messagesApi) {
    ModelConverters.getInstance().addConverter(new IgnoreConverter());
  }

  public Result index() {
    return ok("Hello, World!");
  }
}