SpringBoot項(xiàng)目中枚舉類型字段與前端和數(shù)據(jù)庫的交互方法
在數(shù)據(jù)庫中,我們通常需要定義一些描述狀態(tài)的字段來展示業(yè)務(wù)的進(jìn)展情況或?qū)ο蟮臓顟B(tài),例如user表中定義一個int類型的字段status,0表示賬戶禁用,1表示賬戶正常;transaction交易表中定義一個交易狀態(tài)字段dealStatus,0表示交易取消,1表示交易發(fā)起,2表示交易成功等等。
為了在java代碼中更好地管理這些狀態(tài)字段,我們通常會在項(xiàng)目中定義枚舉類來描述這個字段所有的狀態(tài)值以及對應(yīng)的意思。
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;
}
}在前后端的數(shù)據(jù)交互中,經(jīng)常會涉及到狀態(tài)字段的轉(zhuǎn)換,例如前端需要查詢正常使用的用戶信息,查詢條件為status="1",然后后端查詢到需要的數(shù)據(jù)后,將用戶集合中的狀態(tài)字段的數(shù)字轉(zhuǎn)換為漢字返回給前端。

為此,我們需要在對應(yīng)的需求處調(diào)用getCode()或getName()方法,這會導(dǎo)致我們的代碼冗余度高并且不利于維護(hù)。所以我們可以在項(xiàng)目中定義一個全局的枚舉消息轉(zhuǎn)換器,controller接口可以使用對應(yīng)的枚舉類型去接收參數(shù),并返回前端想要的中文意思。
項(xiàng)目實(shí)踐:
1、定義一個接口BaseEnum,提供getCode()和getName()方法。
public interface BaseEnum {
int getCode();
String getName();
}2、定義具體的枚舉類UserStatus,實(shí)現(xiàn)BaseEnum接口。其他需要的枚舉類均以這種方式創(chuàng)建,定義Integer類型的屬性code和String類型的屬性name。
@EnumValue注解是mybatisplus框架提供的,標(biāo)注在code上表示在java服務(wù)與數(shù)據(jù)庫交互時,status字段的值與UserStatus枚舉類的code屬性進(jìn)行映射。
@JsonValue注解標(biāo)注在枚舉類的name字段上,將對象序列化成json字符串時,status字段會取枚舉類name字段的值封裝到j(luò)son串中。
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、定義一個枚舉消息轉(zhuǎn)換類CodeEnumConverter,實(shí)現(xiàn)接口ConverterFactory<String, BaseEnum>,重寫getConverter()方法,并將自定義轉(zhuǎn)換類的bean交由spring容器管理。
/**
* <String, BaseEnum>
* String表示前端傳遞的參數(shù)是String類型的
* BaseEnum表示我需要將String類型的參數(shù)轉(zhuǎn)換成BaseEnum類型的參數(shù)
*/
@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 對象中所有枚舉常量的數(shù)組
*/
for (T enumConstant : targetType.getEnumConstants()) {
if (enumConstant.getCode() == Integer.valueOf(source)) {
return enumConstant;
}
}
throw new IllegalArgumentException("非法的枚舉值:" + source);
}
};
}
}4、將枚舉消息轉(zhuǎn)換類CodeEnumConverter注冊到springmvc中。
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Autowired
private CodeEnumConverter enumConverter;
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverterFactory(this.enumConverter);
}
}5、controller接口可以使用枚舉類型的字段去接收前端的請求參數(shù)。
@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、發(fā)送請求,查詢狀態(tài)為1的用戶,springmvc接收到請求后會對參數(shù)進(jìn)行轉(zhuǎn)換,然后調(diào)用后端方法,并返回前端



7、在響應(yīng)結(jié)果中,可以看到status的值為"正常",這種請求時傳遞數(shù)值,響應(yīng)時返回漢字的需求,在很多地方都會用到。同時,可以看到響應(yīng)中的createTime和updateTime字段返回的時間信息不符合我們的閱讀習(xí)慣,修改json字符串中時間字段的格式,可以做如下配置:
7.1、在配置文件中添加配置:
spring.jackson.time-zone=GMT+8
7.2、在響應(yīng)的實(shí)體類時間字段上標(biāo)注@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、完成以上兩個步驟后,重新訪問,時間格式就會變成我們所需要的樣子
總結(jié)
到此這篇關(guān)于SpringBoot項(xiàng)目中枚舉類型字段與前端和數(shù)據(jù)庫的交互方法的文章就介紹到這了,更多相關(guān)SpringBoot枚舉字段與前端數(shù)據(jù)庫交互內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
快速解決commons-fileupload組件無法處理自定義head信息的bug
問題在于fileupload組件解析完自定義的head節(jié)點(diǎn)后,卻忘記傳遞到FileItemStreamImpl中了,稍作修訂,即可修正該bug2013-08-08
rabbitmq的消息持久化處理開啟,再關(guān)閉后,消費(fèi)者啟動報(bào)錯問題
這篇文章主要介紹了rabbitmq的消息持久化處理開啟,再關(guān)閉后,消費(fèi)者啟動報(bào)錯問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
Struts2源碼分析之ParametersInterceptor攔截器
這篇文章主要介紹了Struts2源碼分析之ParametersInterceptor攔截器,ParametersInterceptor攔截器其主要功能是把ActionContext中的請求參數(shù)設(shè)置到ValueStack中,,需要的朋友可以參考下2019-06-06
spring?boot?Mybatis?攔截器實(shí)現(xiàn)拼接sql和修改的代碼詳解
這篇文章主要介紹了spring?boot?Mybatis?攔截器實(shí)現(xiàn)拼接sql和修改,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
Mybatis-Plus中分頁插件PaginationInterceptor的使用
我們在開發(fā)的過程中,經(jīng)常會遇到分頁操作,本文主要介紹了Mybatis-Plus中分頁插件PaginationInterceptor的使用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Mybatis中l(wèi)ike搭配concat的寫法詳解
這篇文章主要介紹了Mybatis中l(wèi)ike搭配concat的寫法詳解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01

