Api 枚举参数

枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。所有在API中使用枚举参数,可以是API访问更加安全和简洁。
本文讲的是将String类型的参数转换为枚举类型的参数(int类型同样可以转换,但在这里不做代码说明)。
普通方式:
枚举类:

public enum ValidaMethodEnum {
    //标准的CRC效验
    CRCSTANDARDMODBUS("CrcStandardModBus"),
    BEIWEICUSTOMIZATION("BeiWeiCustomization")
    ;
    private String value;
    private ValidaMethodEnum(String value) {
        this.value =value;
    }
    @Override
    public String toString() {
        return this.value;
    }

    public String getValue() {
        return this.value;
    }
}

转换类:String是转换前的原始类型,ValidaMethodEnum是转换后的目标类型

@Slf4j
public class StringToValidaMethodEnumConverter implements Converter<String, ValidaMethodEnum> {
    @Override
    public ValidaMethodEnum convert(String source) {
        log.info("进来没------");
        for (ValidaMethodEnum t: ValidaMethodEnum.values()) {
            System.out.println("t: " + t);
            if(source.equals(t.getStringValue())){
                return t;
            }
        }
        return null;
    }
}

添加到Spring配置中:注意一定要添加@Configuration注解来声明这是个配置类,只有这样才会在springboot运行中加载进去

@Configuration
@Slf4j
public class MyWebAppConfigurer implements WebMvcConfigurer {


    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToValidaMethodEnumConverter());
    }
}

Controller类:参数类型是ValidaMethodEnum 类型

    @ApiOperation(value = "验证枚举参数",notes = "通过不同的效验方式和类型生成不同的指令效验")
    @RequestMapping(value = "/valideEnum",method = RequestMethod.POST)
    public ResponseEntity valideEnum(@RequestParam(value="validaMethodEnum",required = true) ValidaMethodEnum validaMethodEnum, @RequestParam(value="order",required = true) String order){
        String resultStr=null;
         log.info("validaMethodEnum: " + validaMethodEnum  + "  value: " +  validaMethodEnum.getValue());
        switch (validaMethodEnum.getValue()) {
            // 标准的指令
            case "CrcStandardModBus": {
                resultStr= LegitimateValidationDataService.crcStandardModBus(order);
            }
            break;
            case "BeiWeiCustomization": {
                resultStr=LegitimateValidationDataService.beiWeiCustomization(order);
            }
            break;
            default:{
                resultStr="not's ValidaMethod";
            }
            break;
        }
        return new ResponseEntity<>(resultStr, HttpStatus.OK);
    }

效果图:validaMethodEnum是下拉框,里面的值是枚举中定义的所有值
在这里插入图片描述

控制台:
在这里插入图片描述
工厂方式:像上面这样如果我们订阅了多个枚举类,那么对于每一个枚举,我们都需要实现一个对应的Converter,十分的不方便。所以这时候我们就需要用工厂模式了。
所有枚举所需的实现接口(基接口):

public interface BaseEnum {
    String getStringValue();
//    int getIntValue();
}

然后我们在修改上面的枚举类,去实现这个基接口:

public enum ValidaMethodEnum implements BaseEnum {
    //标准的CRC效验
    CRCSTANDARDMODBUS("CrcStandardModBus"),
    BEIWEICUSTOMIZATION("BeiWeiCustomization")
    ;
    private String value;
    private ValidaMethodEnum(String value) {
        this.value =value;
    }
    @Override
    public String toString() {
        return this.value;
    }

    public String getValue() {
        return this.value;
    }
    @Override
    public String getStringValue() {
        System.out.println("public enum ValidaMethodEnum  --- --- ");
        return value;
    }

}

工厂转换类:String是原始类型,BaseEnum是目标类型,T是目标类型的子类

public class UniversalEnumConverterFactory implements ConverterFactory<String, BaseEnum> {
    @Override
    public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
        if(!targetType.isEnum()){
            throw new UnsupportedOperationException("只支持转换到枚举类型");
        }
        return new StringToEnum<>(targetType);
    }
    //  匿名内部类
    class StringToEnum<T extends BaseEnum> implements Converter<String,T>{
        private final Class<T> enumType;
        StringToEnum(Class<T> enumType) {
            this.enumType = enumType;
        }
        @Override
        public T convert(String source) {
            for (T t: enumType.getEnumConstants()) {
                System.out.println("t: " + t);
                if(source.equals(t.getStringValue())){
                    return t;
                }
            }
            return null;
        }
    }
}

添加到spring配置:

@Configuration
@Slf4j
public class MyWebAppConfigurer implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
//        registry.addConverter(new StringToValidaMethodEnumConverter());
        registry.addConverterFactory(new UniversalEnumConverterFactory());

    }
}

至于Controller类以及效果图与上基本类似,以上就是整个的由String类型参数转换成枚举类型参数的方法,至于由int类型参数转换成枚举类型参数与这个过程基本类似,详细可参考这篇博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值