前言
在使用 JSON 传值的时候,对于枚举类型的处理是比较麻烦的,因为基本上默认都只会按照枚举的名称来序列化和反序列化。先来描述一下需求。
有一个性别枚举:
返回时以对象的形式序列化枚举,格式大致为:
讯享网
入参时以枚举码的形式反序列化枚举,格式为:
SpringBoot Jackson 方案
枚举
讯享网
- 使用注解来让枚举按照类(对象)的格式进行序列化。
- 使用注解标记一个通过枚举码来查询枚举的方法,Jackson 会使用这个有参构造器进行反序列化。
返回DTO
入参DTO及参数校验
- 使用来指定反序列化时接收的属性名
- 使用来指定文档中的属性名和类型
警告
这样做虽然解决了枚举序列化和反序列化的问题。但是同时又引入了另一个问题:
- 在校验时我们指定了创建时分组,可以有效的校验入参数据是合法值。
- 但是如果采用 NOT_NULL 策略更新,那么就不能使用非空校验。
- 因此除了 NULL 值,不存在的枚举码也会导致该字段不进行更新,而且获取失败信息还比较麻烦。
测试


java 基础 博客园

PS
问题的根源还是参数校验,大致经历了如下几个阶段:
- 没有相关枚举校验的注解:DTO 转换时校验,自定义参数校验异常,和 validation 校验异常一起处理。
- 想找一份可复用的校验规则。
- 没找到:自定义一些校验规则。
- 不想自定义:在序列化上想办法。
关于自定义校验规则的念头源于和这两个非常非常常用的注解:
- 别的注解都:null elements are considered valid.
- 这两个注解:The annotated element must not be null.
这也就导致了维护一个大入参DTO,可以通过分组 + @NotNull 来实现的 NOT_NULL 策略更新实际上麻烦的一批。待测的解决方案为:
- 自定义 JSON 反序列化规则自动 trim,使用 校验字符串。
- 使用校验字符串。
PS
如果有比较好用的 validation 扩展,还请提示一下哈
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/10250.html