• 【Java】springboot 枚举参数


    1/💤背景

    很多大厂都要求了代码里面避免魔法值,如阿里巴巴开发规范 阿里巴巴Java开发手册1.4.0 ,那么使用枚举就是比较好避免的一个办法,比如 性别 0-未知 1-男 2-女

    【强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。
    反例:String key = “Id#taobao_” + tradeId;
    cache.put(key, value);

    1、Controller参数能否用枚举接收?
    2、区分大小写?
    3、传枚举的什么值?code 能自动识别么?

    2/💫测试

    为了比较全面的测试,我用三个枚举类进行了测试(实践出真知 )

    public class TestEnum {
        public enum gender {
            man,
            woman
        }
    
        public enum club {
            A(1, "A"),
            B(2, "B");
    
            Integer number;
            String name;
    
            club(Integer number, String name) {
                this.number = number;
                this.name = name;
            }
        }
    
        public enum person {
            A(1, "qq", 23),
            B(2, "aa", 18);
    
            Integer number;
            String name;
            Integer age;
    
            person(Integer number, String name, Integer age) {
                this.number = number;
                this.name = name;
                this.age = age;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    测试非常简单,写一个接口三个枚举参数或三个接口三个枚举参数

    
    	@GetMapping("/gender")
        @ResponseBody
        public String admin(@RequestParam(required = false) TestEnum.gender name) {
            System.out.println(name);
            return "hello word!!!";
        }
        
         @GetMapping("/club")
        @ResponseBody
        public String admin(@RequestParam(required = false) TestEnum.club name) {
            System.out.println(name);
            return "hello word!!!";
        }
        
        @GetMapping("/person")
        @ResponseBody
        public String admin(@RequestParam(required = false) TestEnum.person name) {
            System.out.println(name);
            return "hello word!!!";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    然后手动调用接口,改变参数值,观察返回值和后台日志,打印出名称则表示获取到了对应的枚举,反之则未获取成功。

    3/💦结果

    测试比较简单,可以自己尝试一下,简单来说: 只能识别name

    默认spring的接口对枚举类型的接收处理逻辑比较简单,就是直接匹配name,

    所以有下面几点需要注意:

    1、参数未传的时候,获取到的枚举是null,也就是默认值是空的

    2、如果传不匹配的值(枚举中没有的值),会报转化类型错误 Failed to convert value of type 'xxx' to required type

    3、只能匹配name 也就是枚举本身的名称,比如person枚举,想匹配A(1, "qq", 23),,只能匹配 A 这个参数, 接口请求person/?name=A,而与其他的值无关,比如 1qq23

    4、区分大小写 ,传 a 得到的也是转化类型错误

    当前我们可以自定义 spring 的ConverterConverterFactory来实现 自定义转化逻辑,那么你想怎么处理参数就是你自己的事情了,可以做兼容处理,识别里面的值来转化成枚举而不限定name。

    不过本次测试的是默认的springboot对枚举的处理逻辑,讨论未做额外处理的情况下,spring接口使用枚举的效果和问题。如果后面的人想使用枚举来接收参数,那么就不会完全没有思路。

    如果对你有用,点个赞吧。

    日常偷图(侵删-。-)

    在这里插入图片描述

  • 相关阅读:
    Origin绘制多折线图
    在Jetson Nano上安装Caffe
    【问题思考总结】什么是安全分配方式?
    vue3踩坑分享( 3 )解决 ‘VueRouter‘、vue-router未找到 , this.$router未定义
    CPU与外设交换数据的方式
    Kubernetes:服务与负载均衡
    手机如何使用NFC卡模拟门禁刷卡
    linux下的自旋锁、信号量、互斥、完成量
    最新下载:MindMapper 17【软件附加安装教程】
    1055 集体照(测试点3, 4, 5)
  • 原文地址:https://blog.csdn.net/weixin_41979605/article/details/128113556