Swagger недостаточно умен, чтобы обрабатывать анонимные типы (например, карты)

Я использую enunciate для генерации Swagger для API REST. Одно из моих наследий beans содержит карту, и 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

Я могу подумать о двух способах решения проблемы:

  • Исключить унаследованный класс BarBean из вашей конфигурации enunciate maven
  • Добавить @XmlJavaTypeAdapter аннотацию к 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. */

}