脚本之家

电脑版
提示:原网页已由神马搜索转码, 内容由www.jb51.net提供.
您的位置:首页软件编程java→ SpringBoot枚举字段与前端数据库交互

SpringBoot项目中枚举类型字段与前端和数据库的交互方法

  更新时间:2024年07月12日 11:05:24  作者:唐糕 
最近做的这个项目中,用到了大量的枚举类,下面这篇文章主要给大家介绍了关于SpringBoot项目中枚举类型字段与前端和数据库的交互方法,文中通过代码介绍的非常详细,需要的朋友可以参考下

在数据库中,我们通常需要定义一些描述状态的字段来展示业务的进展情况或对象的状态,例如user表中定义一个int类型的字段status,0表示账户禁用,1表示账户正常;transaction交易表中定义一个交易状态字段dealStatus,0表示交易取消,1表示交易发起,2表示交易成功等等。

为了在java代码中更好地管理这些状态字段,我们通常会在项目中定义枚举类来描述这个字段所有的状态值以及对应的意思。

public enum BaseStatus {
ENABLE(1, "正常"),
DISABLE(0, "禁用");
private Integer code;
private String name;
BaseStatus(Integer code, String name) {
this.code = code;
this.name = name;
}
public Integer getCode() {
return this.code;
}
public String getName() {
return this.name;
}
}

在前后端的数据交互中,经常会涉及到状态字段的转换,例如前端需要查询正常使用的用户信息,查询条件为status="1",然后后端查询到需要的数据后,将用户集合中的状态字段的数字转换为汉字返回给前端。

为此,我们需要在对应的需求处调用getCode()或getName()方法,这会导致我们的代码冗余度高并且不利于维护。所以我们可以在项目中定义一个全局的枚举消息转换器,controller接口可以使用对应的枚举类型去接收参数,并返回前端想要的中文意思。

项目实践:

1、定义一个接口BaseEnum,提供getCode()和getName()方法。

public interface BaseEnum {
int getCode();
String getName();
}

2、定义具体的枚举类UserStatus,实现BaseEnum接口。其他需要的枚举类均以这种方式创建,定义Integer类型的属性code和String类型的属性name。

@EnumValue注解是mybatisplus框架提供的,标注在code上表示在java服务与数据库交互时,status字段的值与UserStatus枚举类的code属性进行映射。

@JsonValue注解标注在枚举类的name字段上,将对象序列化成json字符串时,status字段会取枚举类name字段的值封装到json串中。

public enum UserStatus implements BaseEnum {
ENABLE(1, "正常"),
DISABLE(0, "禁用");
@EnumValue
private Integer code;
@JsonValue
private String name;
UserStatus(Integer code, String name) {
this.code = code;
this.name = name;
}
@Override
public int getCode() {
return this.code;
}
@Override
public String getName() {
return this.name;
}
}

3、定义一个枚举消息转换类CodeEnumConverter,实现接口ConverterFactory<String, BaseEnum>,重写getConverter()方法,并将自定义转换类的bean交由spring容器管理。

/**
* <String, BaseEnum>
* String表示前端传递的参数是String类型的
* BaseEnum表示我需要将String类型的参数转换成BaseEnum类型的参数
*/
@Component
public class CodeEnumConverter implements ConverterFactory<String, BaseEnum> {
@Override
public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
return new Converter<String, T>() {
@Override
public T convert(String source) {
/*
Class.getEnumConstants()方法是Java反射API中的一个方法,
用于获取表示枚举类型的 Class 对象中所有枚举常量的数组
*/
for (T enumConstant : targetType.getEnumConstants()) {
if (enumConstant.getCode() == Integer.valueOf(source)) {
return enumConstant;
}
}
throw new IllegalArgumentException("非法的枚举值:" + source);
}
};
}
}

4、将枚举消息转换类CodeEnumConverter注册到springmvc中。

@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Autowired
private CodeEnumConverter enumConverter;
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverterFactory(this.enumConverter);
}
}

5、controller接口可以使用枚举类型的字段去接收前端的请求参数。

@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService userService;
@GetMapping("/getUser")
public List<User> getUser(@RequestParam(value = "status", required = false) UserStatus status) {
List<User> list = userService.lambdaQuery()
.eq(!ObjectUtils.isEmpty(status), User::getStatus, status).list();
return list;
}
}

6、发送请求,查询状态为1的用户,springmvc接收到请求后会对参数进行转换,然后调用后端方法,并返回前端

7、在响应结果中,可以看到status的值为"正常",这种请求时传递数值,响应时返回汉字的需求,在很多地方都会用到。同时,可以看到响应中的createTime和updateTime字段返回的时间信息不符合我们的阅读习惯,修改json字符串中时间字段的格式,可以做如下配置:

7.1、在配置文件中添加配置:

spring.jackson.time-zone=GMT+8

7.2、在响应的实体类时间字段上标注@JsonFormat注解,并指定时间格式

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;

7.3、完成以上两个步骤后,重新访问,时间格式就会变成我们所需要的样子       

总结

到此这篇关于SpringBoot项目中枚举类型字段与前端和数据库的交互方法的文章就介绍到这了,更多相关SpringBoot枚举字段与前端数据库交互内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

    • 这篇文章主要为大家介绍了Spring循环引用失败问题源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
      2022-09-09
    • 在Spring MVC中,请求映射路径是指与特定的请求处理方法关联的URL路径,这篇文章主要介绍了Spring MVC 请求映射路径的配置,实现前后端交互,需要的朋友可以参考下
      2023-09-09
    • 这篇文章主要介绍了Spring中的@ControllerAdvice和@ExceptionHandler注解处理全局异常,@ControllerAdvice ,@ControllerAdvice是一个非常有用的注解,顾名思义,这是一个增强的 Controller,一般配合@ExceptionHandler使用来处理全局异常,需要的朋友可以参考下
      2024-01-01
    • 这篇文章主要介绍了解决Mybatis的serverTimezone时区出现问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
      2021-09-09
    • 这篇文章主要介绍了一文详解Java抽象类到底有多抽象,抽象方法所在的类必须是抽象类,子类若继承了一个抽象类,就必须覆写父类的所有抽象方法,这里的子类是普通类,是强制要求覆写所有抽象方法,但是如果子类也是一个抽象类,那么就可以不覆写
      2022-06-06
    • 这篇文章主要收录了44道面试中经常被问的SpringBoot问题,不管你是正在求职的新手还是已经工作很久的高手,这篇关于SpringBoot的面试题总结一定会让你有新的理解,让我们一起来看看吧
      2023-03-03
    • 下面小编就为大家带来一篇浅谈java继承中是否创建父类对象。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
      2017-06-06
    • 这篇文章主要介绍了解决Spring Boot项目端口8080被占用的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
      2020-09-09
    • 这篇文章主要为大家详细介绍了Java入门案列之猜拳小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
      2019-11-11
    • 这篇文章主要介绍了Java编程实现基于图的深度优先搜索和广度优先搜索完整代码,具有一定借鉴价值,需要的朋友可以了解下。
      2017-12-12

    最新评论