有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在使用enunciate为REST API生成Swagger文档。我的一个遗留bean包含一个地图,而斯威格对此抱怨:

[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忽略了没有@XmlRootElement注释的类,但是BazBean不幸地被用于另一个接受XML的端点


共 (1) 个答案

  1. # 1 楼答案

    我可以想出两种方法来解决这个问题:

    1. 将遗留类BarBean从您的DenuclateMaven配置中排除
    2. BarBean#getBazBeans()方法添加@XmlJavaTypeAdapter注释

    我将更详细地描述第二种解决方案,因为第一种是众所周知的。getBazBeans()的返回类型是匿名类型,这意味着它没有在项目中声明。您可以使用javax.xml.bind.annotation.adapters.XmlAdapter来更改它,通过javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter注释将其连接到getBazBeans()方法返回类型

    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. */
    
    }