【Swagger@ApiModelProperty使用枚举类】

1.自定义注解类

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiModelPropertyEnum {

    Class value();

}

2.实现Swagger的ModelPropertyBuilderPlugin

@Component
@Order(-2147482648)
public class YouYaModelPropertyBuilderPlugin implements ModelPropertyBuilderPlugin {

    private final DescriptionResolver descriptions;

    @Autowired
    public YouYaModelPropertyBuilderPlugin(DescriptionResolver descriptions) {
        this.descriptions = descriptions;
    }

    @Override
    public void apply(ModelPropertyContext context) {
        Optional<ApiModelProperty> annotation = Optional.empty();
        if (context.getAnnotatedElement().isPresent()) {
            annotation = (Optional) annotation.map(Optional::of).orElse(ApiModelProperties.findApiModePropertyAnnotation((AnnotatedElement) context.getAnnotatedElement().get()));
        }

        if (context.getBeanPropertyDefinition().isPresent()) {
            annotation = (Optional) annotation.map(Optional::of).orElse(Annotations.findPropertyAnnotation((BeanPropertyDefinition) context.getBeanPropertyDefinition().get(), ApiModelProperty.class));
        }

        if (annotation.isPresent()) {
            ApiModelProperty apiModelProperty = annotation.get();
            ApiModelPropertyEnum apiModelPropertyEnum = context.getBeanPropertyDefinition().get().getField().getAnnotation(ApiModelPropertyEnum.class);
            try {
                StringBuilder stringBuilder = null;
                if (apiModelPropertyEnum != null && !apiModelProperty.value().contains("枚举")) {
                    InvocationHandler invocationHandler = Proxy.getInvocationHandler(apiModelProperty);
                    Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues");
                    memberValues.setAccessible(true);
                    Map o = (Map) memberValues.get(invocationHandler);
                    Class<?> aClass = apiModelPropertyEnum.value();
                    Object[] enumConstants = aClass.getEnumConstants();
                    stringBuilder = new StringBuilder();
                    stringBuilder.append(apiModelProperty.value());
                    stringBuilder.append("枚举(");
                    for (Object enumConstant : enumConstants) {
                        Method[] declaredMethods = aClass.getDeclaredMethods();
                        for (Method declaredMethod : declaredMethods) {
                            String name = declaredMethod.getName();
                            if (name.equals("values") || name.equals("valueOf")) {
                                continue;
                            }
                            stringBuilder.append(declaredMethod.invoke(enumConstant));
                            stringBuilder.append(":");
                        }
                        stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length());
                        stringBuilder.append(",");
                    }
                    stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length());
                    stringBuilder.append(")");
                    o.put("value", stringBuilder.toString());
                }
                context.getBuilder()
                        .allowableValues(apiModelProperty.allowableValues() == null ? null : ApiModelProperties.allowableValueFromString(apiModelProperty.allowableValues()))
                        .required(apiModelProperty.required())
                        .readOnly(apiModelProperty.readOnly())
                        .description(stringBuilder == null ? null : stringBuilder.toString())
                        .isHidden(apiModelProperty.hidden())
                        .type(resolve(context.getResolver(), apiModelProperty))
                        .position(apiModelProperty.position());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public ResolvedType resolve(TypeResolver resolver, ApiModelProperty apiModelProperty) {
        try {
            return resolver.resolve(Class.forName(apiModelProperty.dataType()), new Type[0]);
        } catch (ClassNotFoundException e) {
            return resolver.resolve(Object.class, new Type[0]);
        }

    }

    @Override
    public boolean supports(DocumentationType delimiter) {
        return SwaggerPluginSupport.pluginDoesApply(delimiter);
    }
}

3.使用示例

@ApiModel(value = "商品规格Db")
public class GoodsSpeDb implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 状态
     */
    @ApiModelPropertyEnum(value = GoodsStatusEnum.class)
    @ApiModelProperty(value = "状态")
    private Integer goodsSpeStatus;

}

4.Swagger文档展示

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值