java 基础 博客园

java 基础 博客园前言 在使用 JSON 传值的时候 对于枚举类型的处理是比较麻烦的 因为基本上默认都只会按照枚举的名称来序列化和反序列化 先来描述一下需求 有一个性别枚举 返回时以对象的形式序列化枚举 格式大致为 入参时以枚举码的形式反序列化枚举 格式为 SpringBoot Jackson 方案 枚举 使用注解来让枚举按照类 对象 的格式进行序列化 使用注解标记一个通过枚举码来查询枚举的方法

大家好,我是讯享网,很高兴认识大家。



前言

在使用 JSON 传值的时候,对于枚举类型的处理是比较麻烦的,因为基本上默认都只会按照枚举的名称来序列化和反序列化。先来描述一下需求。

有一个性别枚举:

返回时以对象的形式序列化枚举,格式大致为:

讯享网

入参时以枚举码的形式反序列化枚举,格式为:

 

SpringBoot Jackson 方案

枚举
讯享网
  1. 使用注解来让枚举按照类(对象)的格式进行序列化。
  2. 使用注解标记一个通过枚举码来查询枚举的方法,Jackson 会使用这个有参构造器进行反序列化。
返回DTO
 
入参DTO及参数校验
 
  1. 使用来指定反序列化时接收的属性名
  2. 使用来指定文档中的属性名和类型

警告

这样做虽然解决了枚举序列化和反序列化的问题。但是同时又引入了另一个问题:

  • 在校验时我们指定了创建时分组,可以有效的校验入参数据是合法值。
  • 但是如果采用 NOT_NULL 策略更新,那么就不能使用非空校验。
  • 因此除了 NULL 值,不存在的枚举码也会导致该字段不进行更新,而且获取失败信息还比较麻烦。
测试
 

java Json 枚举 博客园 json枚举类参数_jackson

java 基础 博客园java Json 枚举 博客园 json枚举类参数_java Json 枚举 博客园_02

java Json 枚举 博客园 json枚举类参数_spring_03

PS

问题的根源还是参数校验,大致经历了如下几个阶段:

  1. 没有相关枚举校验的注解:DTO 转换时校验,自定义参数校验异常,和 validation 校验异常一起处理。
  2. 想找一份可复用的校验规则。
  3. 没找到:自定义一些校验规则。
  4. 不想自定义:在序列化上想办法。

关于自定义校验规则的念头源于和这两个非常非常常用的注解:

  • 别的注解都:null elements are considered valid.
  • 这两个注解:The annotated element must not be null.

这也就导致了维护一个大入参DTO,可以通过分组 + @NotNull 来实现的 NOT_NULL 策略更新实际上麻烦的一批。待测的解决方案为:

  1. 自定义 JSON 反序列化规则自动 trim,使用 校验字符串。
  2. 使用校验字符串。

PS

如果有比较好用的 validation 扩展,还请提示一下哈

小讯
上一篇 2025-01-02 23:54
下一篇 2024-12-29 09:17

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/10250.html