在其它兩篇文章中,已經解決的自定義枚舉在MyBatis以及Rest接口的轉換,可是在Springfox中還存在問題,不能使用code來做爲api。本文經過擴展Springfox,實現了對自定義枚舉的良好支持。api
ps: 枚舉的定義參見 自定義枚舉 --- MyBatis字段映射app
存在2個問題ide
CodedEnum
的定義請參見其餘文章)實現ModelPropertyBuilderPlugin
接口,ui
@Component public class CodedEnumPropertyPlugin implements ModelPropertyBuilderPlugin { @Override public void apply(ModelPropertyContext context) { Optional<ApiModelProperty> annotation = Optional.absent(); if (context.getAnnotatedElement().isPresent()) { annotation = annotation.or(ApiModelProperties.findApiModePropertyAnnotation(context.getAnnotatedElement().get())); } if (context.getBeanPropertyDefinition().isPresent()) { annotation = annotation.or(Annotations.findPropertyAnnotation( context.getBeanPropertyDefinition().get(), ApiModelProperty.class)); } final Class<?> rawPrimaryType = context.getBeanPropertyDefinition().get().getRawPrimaryType(); //過濾獲得目標類型 if (annotation.isPresent() && CodedEnum.class.isAssignableFrom(rawPrimaryType)) { //獲取CodedEnum的code值 CodedEnum[] values = (CodedEnum[]) rawPrimaryType.getEnumConstants(); final List<String> displayValues = Arrays.stream(values).map(codedEnum -> Integer.toString(codedEnum.getCode())).collect(Collectors.toList()); final AllowableListValues allowableListValues = new AllowableListValues(displayValues, rawPrimaryType.getTypeName()); //固定設置爲int類型 final ResolvedType resolvedType = context.getResolver().resolve(int.class); context.getBuilder().allowableValues(allowableListValues).type(resolvedType); } } @Override public boolean supports(DocumentationType documentationType) { return true; } }