SpringBoot项目中,摆列类型字段与前端和数据库的交互

打印 上一主题 下一主题

主题 492|帖子 492|积分 1476

        在数据库中,我们通常必要定义一些描述状态的字段来展示业务的进展情况或对象的状态,例如user表中定义一个int类型的字段status,0表示账户禁用,1表示账户正常;transaction买卖业务表中定义一个买卖业务状态字段dealStatus,0表示买卖业务取消,1表示买卖业务发起,2表示买卖业务成功等等。
        为了在java代码中更好地管理这些状态字段,我们通常会在项目中定义摆列类来描述这个字段所有的状态值以及对应的意思。
  1. public enum BaseStatus {
  2.     ENABLE(1, "正常"),
  3.     DISABLE(0, "禁用");
  4.     private Integer code;
  5.     private String name;
  6.     BaseStatus(Integer code, String name) {
  7.         this.code = code;
  8.         this.name = name;
  9.     }
  10.     public Integer getCode() {
  11.         return this.code;
  12.     }
  13.     public String getName() {
  14.         return this.name;
  15.     }
  16. }
复制代码
         在前后端的数据交互中,经常会涉及到状态字段的转换,例如前端必要查询正常利用的用户信息,查询条件为status="1",然后后端查询到必要的数据后,将用户集会合的状态字段的数字转换为汉字返回给前端。

        为此,我们必要在对应的需求处调用getCode()或getName()方法,这会导致我们的代码冗余度高而且倒霉于维护。所以我们可以在项目中定义一个全局的摆列消息转换器,controller接口可以利用对应的摆列类型去接收参数,并返回前端想要的中文意思。
        项目实践:
        1、定义一个接口BaseEnum,提供getCode()和getName()方法。
  1. public interface BaseEnum {
  2.     int getCode();
  3.     String getName();
  4. }
复制代码
        2、定义详细的摆列类UserStatus,实现BaseEnum接口。其他必要的摆列类均以这种方式创建,定义Integer类型的属性code和String类型的属性name。
        @EnumValue注解是mybatisplus框架提供的,标注在code上表示在java服务与数据库交互时,status字段的值与UserStatus摆列类的code属性进行映射。
        @JsonValue注解标注在摆列类的name字段上,将对象序列化成json字符串时,status字段会取摆列类name字段的值封装到json串中。
  1. public enum UserStatus implements BaseEnum {
  2.     ENABLE(1, "正常"),
  3.     DISABLE(0, "禁用");
  4.     @EnumValue
  5.     private Integer code;
  6.     @JsonValue
  7.     private String name;
  8.     UserStatus(Integer code, String name) {
  9.         this.code = code;
  10.         this.name = name;
  11.     }
  12.     @Override
  13.     public int getCode() {
  14.         return this.code;
  15.     }
  16.     @Override
  17.     public String getName() {
  18.         return this.name;
  19.     }
  20. }
复制代码
          3、定义一个摆列消息转换类CodeEnumConverter,实现接口ConverterFactory<String, BaseEnum>,重写getConverter()方法,并将自定义转换类的bean交由spring容器管理。
  1. /**
  2. * <String, BaseEnum>
  3. * String表示前端传递的参数是String类型的
  4. * BaseEnum表示我需要将String类型的参数转换成BaseEnum类型的参数
  5. */
  6. @Component
  7. public class CodeEnumConverter implements ConverterFactory<String, BaseEnum> {
  8.     @Override
  9.     public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
  10.         return new Converter<String, T>() {
  11.             @Override
  12.             public T convert(String source) {
  13.                 /*
  14.                     Class.getEnumConstants()方法是Java反射API中的一个方法,
  15.                     用于获取表示枚举类型的 Class 对象中所有枚举常量的数组
  16.                 */
  17.                 for (T enumConstant : targetType.getEnumConstants()) {
  18.                     if (enumConstant.getCode() == Integer.valueOf(source)) {
  19.                         return enumConstant;
  20.                     }
  21.                 }
  22.                 throw new IllegalArgumentException("非法的枚举值:" + source);
  23.             }
  24.         };
  25.     }
  26. }
复制代码
        4、将摆列消息转换类CodeEnumConverter注册到springmvc中。
  1. @Configuration
  2. public class WebMvcConfiguration implements WebMvcConfigurer {
  3.     @Autowired
  4.     private CodeEnumConverter enumConverter;
  5.     @Override
  6.     public void addFormatters(FormatterRegistry registry) {
  7.         registry.addConverterFactory(this.enumConverter);
  8.     }
  9. }
复制代码
        5、controller接口可以利用摆列类型的字段去接收前端的哀求参数。
  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4.     @Autowired
  5.     private IUserService userService;
  6.     @GetMapping("/getUser")
  7.     public List<User> getUser(@RequestParam(value = "status", required = false) UserStatus status) {
  8.         List<User> list = userService.lambdaQuery()
  9.             .eq(!ObjectUtils.isEmpty(status), User::getStatus, status).list();
  10.         return list;
  11.     }
  12. }
复制代码
        6、发送哀求,查询状态为1的用户,springmvc接收到哀求后会对参数进行转换,然后调用后端方法,并返回前端

        7、在相应结果中,可以看到status的值为"正常",这种哀求时转达数值,相应时返回汉字的需求,在很多地方都会用到。同时,可以看到相应中的createTime和updateTime字段返回的时间信息不符合我们的阅读习惯,修改json字符串中时间字段的格式,可以做如下配置:
        7.1、在配置文件中添加配置:
  1. spring.jackson.time-zone=GMT+8
复制代码
        7.2、在相应的实体类时间字段上标注@JsonFormat注解,并指定时间格式
  1. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  2. private LocalDateTime createTime;
  3. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  4. private LocalDateTime updateTime;
复制代码
        7.3、完成以上两个步调后,重新访问,时间格式就会酿成我们所必要的样子        


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

涛声依旧在

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表