最近看到有人使用这几个注解,就稍微了解了一下各自的用法,发现枚举在前后台传值,DB和entity之间的映射很方便
1.使用@JsonCreator,可以将前台的属性值直接转换为枚举类型
2.@EnumValue 将枚举中的指定的值直接存储到数据库,不需要再手动转换
3.@JsonValue 后台返回前台数据时也不需要转换,可以直接返回指定的值

案例

  • User实体

    @TableName("user")
    @Data
    public class User {
      
      private Integer id;
    
      private String name;
    
      private Integer age;
      
      private SexEnum sex;
      
    }
  • 枚举类

    public enum SexEnum {
      
      MALE(1,"男"),
      FEMALE(2,"女")
      ;
    
      @EnumValue //数据库中直接存入枚举属性val的值
      private Integer val;
      
      @JsonValue //序列化枚举对象时,返回其属性desc的值
      private String desc;
    
      SexEnum(Integer val, String desc) {
          this.val = val;
          this.desc = desc;
      }
    
      /**
       * 1.通过属性desc获取对应的枚举
       * 2.JsonCreator加在构造方法或者静态方法上,为对象的反序列化指定构造逻辑
       * 3.前端向后台传输json参数,json反序列化成对象时会自动调用这个方法
       */
      @JsonCreator
      public static SexEnum fromDesc(String desc) {
          System.out.println("进入枚举自定义构造方法");
          for(SexEnum sexEnum : SexEnum.values()) {
              if(sexEnum.getDesc().equals(desc)) {
                  return sexEnum;
              }
          }
          return null;
      }
    
      public Integer getVal() {
          return val;
      }
    
      public void setVal(Integer val) {
          this.val = val;
      }
    
      public String getDesc() {
          return desc;
      }
    
      public void setDesc(String desc) {
          this.desc = desc;
      }
    }
  • 请求类

    @RequestMapping("/getUser")
      @ResponseBody
      public User getUser(User u) {
          //返回数据给前台时,序列化对象时,其中的枚举类型会根据@JsonValue指定的字段进行处理
          User user = userService.getUser();
          return user;
      }
    
      
      @RequestMapping("/save_user")
      @ResponseBody
      public String saveUser(@RequestBody User u) {
         //前台传入Sex字符串,直接转换为枚举对象 
         // json反序列化时自动调用了SexEnum中的fromDesc()获取枚举对象,然后赋值给u中的sex
         userService.saveUser(u);
         return "success";
      }

    效果图

  • postman中的入参,一定要使用json格式,使用表单无效果
    image.png
  • 看到控制台打印了一句话,说明反序列化枚举对象时,使用了我们自定义的方法
    image.png
  • 可以看到sex属性中的值前端传入的值‘男’,但是后台接收到为SexEnum的"MALE"
    image.png
  • 数据库中的数据,按照@EnumValue指定的属性存入数据
    image.png
    从数据库中查询的数据,枚举按照我们使用@jsonValue的字段返回值
    image.png

forest
0 声望1 粉丝

下一篇 »
单例模式