枚举类型是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类型参数转换成枚举类型参数与这个过程基本类似