Swagger不够聪明,无法处理匿名类型(如地图)

时间:2013-11-18 09:12:59

标签: java swagger enunciate swagger-ui

我正在使用enunciate为REST API生成Swagger文档。我的一个遗留bean包含一个Map,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() {

是否有任何注释我可以放入bean类中,以便Swagger可以处理这个?

除此之外,有没有办法告诉Swagger简单地忽略这个领域或全班?我知道Swagger在没有@XmlRootElement注释的情况下忽略了类,但BazBean在另一个接受XML的端点中不幸地使用了。

1 个答案:

答案 0 :(得分:2)

我可以想出两种解决问题的方法:

  1. 从您的enunciate maven配置中排除旧版BarBean
  2. @XmlJavaTypeAdapter方法
  3. 添加BarBean#getBazBeans()注释

    我将更详细地描述第二种解决方案,因为第一种解决方案是众所周知的。 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. */
    
    }