Swagger展示枚举类型参数
实现原理:修改@ApiModelProperty的属性:value、dataType、allowableValues
@Component public class SwaggerDisplayConfig implements ModelPropertyBuilderPlugin { @Override public void apply(ModelPropertyContext context) { AnnotatedField field = context.getBeanPropertyDefinition().get().getField(); Class<?> rawType = field.getRawType(); if (!rawType.isEnum()) { return; } ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class); // Annotation是通过代理来设置并存储属性值的 InvocationHandler ih = Proxy.getInvocationHandler(annotation); try { // Annotation所有属性的值都存储在InvocationHandler的memberValues属性,该属性类型为Map Field memberValuesField = ih.getClass().getDeclaredField("memberValues"); memberValuesField.setAccessible(true); Map memberValues = (Map)memberValuesField.get(ih); String className = rawType.getDeclaredField("value").getType().getName(); memberValues.put("dataType", className); Object[] enumConstants = rawType.getEnumConstants(); Method getValue = rawType.getMethod("getValue"); Method getDesc = rawType.getMethod("getDesc"); List<String> descriptions = new ArrayList<>(); List<String> allowableValues = new ArrayList<>(); for (Object e : enumConstants){ String v = getValue.invoke(e).toString(); allowableValues.add(v); descriptions.add(v + ":" + getDesc.invoke(e)); } memberValues.put("value", ((String)memberValues.get("value")).concat("。").concat(String.join(",", descriptions))); memberValues.put("allowableValues", String.join(",", allowableValues)); } catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { e.printStackTrace(); } } @Override public boolean supports(DocumentationType documentationType) { return true; } }
效果: