Java Swagger UI - 如何正确配置枚举?

时间:2016-08-06 10:50:24

标签: java spring-mvc enums swagger-ui

我在Java spring / hibernate中使用Swagger-UI。 Swagger UI版本为2。

我很难使用枚举。

我有一个POJO模型,其中我声明了以下枚举属性。

@Enumerated(EnumType.STRING)
@Column(name = "gender")
@Access(AccessType.FIELD)
private Gender gender;

和性别如下:

public enum Gender {

    M("Male"), F("Female");

    private String displayValue;

    private Gender(String displayValue) {
        this.displayValue = displayValue;
    }

    @Override
    public String toString() {
        return displayValue;
    }

    public String getDisplayValue() {
        return displayValue;
    }

    public String getName() {
        return name();
    }   
}

但我的招摇在UI中仅显示显示值(malefemale)以及下拉列表的显示值。我希望Swagger UI显示类似下面的类似HTML的东西:

<select name="gender">
<option value="M">Male</option>
<option value="F">Female</option>
</select>

如何实现这一目标?  阅读Swagger UI文档,它让我感到困惑,无法理解它。请帮忙。

1 个答案:

答案 0 :(得分:1)

您需要通过实现接口AllowableMapValues创建一个自定义类(springfox.documentation.service.AllowableValues),该接口将返回Map类型而不是List类型。 (请参阅类springfox.documentation.service.AllowableListValues以供参考)。

之后,您需要使用springfox.documentation.schema.Enums类中的静态方法,方法是隐藏静态方法(AllowableValues allowableValues(Class<?> type))以返回新创建的AllowableMapValues类,例如

public static AllowableValues allowableValues(Class<?> type) {
    if (type.isEnum()) {
      Map<String, String> enumValues = getEnumMapValues(type);
      return new AllowableMapValues(enumValues, "MAP");
    }
    return null;
  }

其中<“ K”,“ V”>对如<“ M”,“ Male”>

您应该创建静态方法getEnumMapValues,该方法应与getEnumValues类中的Enums方法相同。

现在将生成所需的类型。

请记住将@JsonValue注释放在要显示在UI上的Gender枚举中。 Swagger默认情况下会拾取用@JsonValue注释的值。如果找不到,它将直接将输入作为字符串。

我还没有尝试过所有方法,但是通过注释以下方法,我能够在挥杆下拉菜单中获得Enum名称而不是Enum值。

@JsonValue  
public String enumName() {
    return name();
}

这将返回以下内容 M

如果解决了问题,您可以尝试上述方法