接口入参转枚举

枚举转换方案

方案一

直接针对具体的枚举加转换器,简单,但是繁琐,有多少个需要转换的枚举类,就得加几个转换器

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<String, UpperEnum>() {
            @Override
            public <T extends UpperEnum> Converter<String, T> getConverter(Class<T> 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
            public <T extends UpperEnum> Converter<String, T> getConverter(Class<T> 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();
    }

 

posted @ 2022-05-24 11:16  1156740846  阅读(323)  评论(0编辑  收藏  举报