接口入参转枚举
枚举转换方案
方案一
直接针对具体的枚举加转换器,简单,但是繁琐,有多少个需要转换的枚举类,就得加几个转换器
http://localhost:8083/test/printf?returnMode=first
public enum ExampleEnum { FIRST, SECOND; } @Autowired public void addFormatters(FormatterRegistry registry) { registry.addConverter(String.class, ExampleEnum.class, source -> ExampleEnum.valueOf(source.toUpperCase())); }
方案二
案例一
针对某一中转换类型的枚举添加转换器(下面是入参字符串忽略大小写转枚举)
http://localhost:8083/test/printf?returnMode=first
public enum ExampleEnum implements UpperEnum { FIRST, SECOND; @Override public String getCode() { return name(); } } public interface UpperEnum { String getCode(); } @Autowired public void addFormatters(FormatterRegistry registry) { registry.addConverterFactory(new ConverterFactory() { @Override public extends UpperEnum> Converter getConverter(Class targetType) { T[] enums = targetType.getEnumConstants(); return source -> { for (T e : enums) { if (e.getCode().equalsIgnoreCase(source)) { return e; } } throw new IllegalArgumentException("枚举 Code 不正确"); }; } }); }
案例二
还可以转数字为枚举,需要注意的是,下面的入参依然是String,如果写Integer的话,这个转换器并不会生效
http://localhost:8083/test/printf?returnMode=1
public enum ExampleEnum implements UpperEnum { FIRST(1), SECOND(2); int code; ExampleEnum(int code) { this.code = code; } @Override public int getCode() { return code; } } public interface UpperEnum { int getCode(); } @Autowired public void addFormatters(FormatterRegistry registry) { registry.addConverterFactory(new ConverterFactory<String, UpperEnum>() { @Override publicextends UpperEnum> Converter<String, T> getConverter(Class targetType) { T[] enums = targetType.getEnumConstants(); return source -> { if (source == null) { return null; } for (T e : enums) { if (e.getCode() == Integer.parseInt(source)) { return e; } } throw new IllegalArgumentException("枚举 Code 不正确"); }; } }); }
接口
@GetMapping("/printf") public String printf(@RequestParam ExampleEnum returnMode){ return returnMode.name(); }