11

enunciateを使用して、REST API のSwaggerドキュメントを生成しています。私のレガシー Bean の 1 つにマップが含まれており、Swagger はこれについて不平を言っています。

[INFO] --- maven-enunciate-plugin:1.27:docs (default) @ foo-api ---
[INFO] initializing enunciate.
[INFO] invoking enunciate:generate step...
[WARNING] Validation result has errors.
/.../rest/BarBean.java:170: [swagger] Swagger isn't smart enough to handle anonymous types (such as maps).
   public HashMap<String, BazBean> getBazBeans() {

Swagger がこれを処理できるように、Bean クラスにドロップできる注釈はありますか?

それを除いて、フィールドまたはクラス全体を単に無視するように Swagger に指示する方法はありますか? @XmlRootElementSwagger がアノテーションのないクラスを無視することは知っていますが、残念ながらBazBeanXML を受け入れる別のエンドポイントで使用されています。

4

1 に答える 1

2

この問題を回避するには、次の 2 つの方法が考えられます。

  1. BarBeanenunciate maven 構成からレガシー クラスを除外する
  2. メソッドに@XmlJavaTypeAdapter注釈を追加するBarBean#getBazBeans()

最初のソリューションはよく知られているため、2 番目のソリューションについて詳しく説明します。の戻り値の型getBazBeans()は匿名型です。つまり、プロジェクトで宣言されていません。これを で変更し、アノテーションを介してメソッドの戻り値の型javax.xml.bind.annotation.adapters.XmlAdapterに接続できますgetBazBeans()javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter

import import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
public class BarBean {

  @XmlJavaTypeAdapter( BazBeansAdapter.class )
  Map<String, BazBean> getBazBeans() { /* ... */ }

}

public class BazBeansAdapter extends XmlAdapter<BazBeansContainer, Map<String, BayBean>> {

  /*
  Your implementation of serialization and deserialization. 
  Usually creating and reading the container object. 
  */

}


public class BazBeansContainer {

  private Map<String, BayBean> beans;    

  /* Getter, Setter, etc. */

}
于 2014-08-24T20:08:11.603 に答える