SpringBoot項(xiàng)目中枚舉類型字段與前端和數(shù)據(jù)庫(kù)的交互方法
在數(shù)據(jù)庫(kù)中,我們通常需要定義一些描述狀態(tài)的字段來(lái)展示業(yè)務(wù)的進(jìn)展情況或?qū)ο蟮臓顟B(tài),例如user表中定義一個(gè)int類型的字段status,0表示賬戶禁用,1表示賬戶正常;transaction交易表中定義一個(gè)交易狀態(tài)字段dealStatus,0表示交易取消,1表示交易發(fā)起,2表示交易成功等等。
為了在java代碼中更好地管理這些狀態(tài)字段,我們通常會(huì)在項(xiàng)目中定義枚舉類來(lái)描述這個(gè)字段所有的狀態(tài)值以及對(duì)應(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)常會(huì)涉及到狀態(tài)字段的轉(zhuǎn)換,例如前端需要查詢正常使用的用戶信息,查詢條件為status="1",然后后端查詢到需要的數(shù)據(jù)后,將用戶集合中的狀態(tài)字段的數(shù)字轉(zhuǎn)換為漢字返回給前端。
為此,我們需要在對(duì)應(yīng)的需求處調(diào)用getCode()或getName()方法,這會(huì)導(dǎo)致我們的代碼冗余度高并且不利于維護(hù)。所以我們可以在項(xiàng)目中定義一個(gè)全局的枚舉消息轉(zhuǎn)換器,controller接口可以使用對(duì)應(yīng)的枚舉類型去接收參數(shù),并返回前端想要的中文意思。
項(xiàng)目實(shí)踐:
1、定義一個(gè)接口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ù)庫(kù)交互時(shí),status字段的值與UserStatus枚舉類的code屬性進(jìn)行映射。
@JsonValue注解標(biāo)注在枚舉類的name字段上,將對(duì)象序列化成json字符串時(shí),status字段會(huì)取枚舉類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、定義一個(gè)枚舉消息轉(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中的一個(gè)方法, 用于獲取表示枚舉類型的 Class 對(duì)象中所有枚舉常量的數(shù)組 */ for (T enumConstant : targetType.getEnumConstants()) { if (enumConstant.getCode() == Integer.valueOf(source)) { return enumConstant; } } throw new IllegalArgumentException("非法的枚舉值:" + source); } }; } }
4、將枚舉消息轉(zhuǎn)換類CodeEnumConverter注冊(cè)到springmvc中。
@Configuration public class WebMvcConfiguration implements WebMvcConfigurer { @Autowired private CodeEnumConverter enumConverter; @Override public void addFormatters(FormatterRegistry registry) { registry.addConverterFactory(this.enumConverter); } }
5、controller接口可以使用枚舉類型的字段去接收前端的請(qǐng)求參數(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ā)送請(qǐng)求,查詢狀態(tài)為1的用戶,springmvc接收到請(qǐng)求后會(huì)對(duì)參數(shù)進(jìn)行轉(zhuǎn)換,然后調(diào)用后端方法,并返回前端
7、在響應(yīng)結(jié)果中,可以看到status的值為"正常",這種請(qǐng)求時(shí)傳遞數(shù)值,響應(yīng)時(shí)返回漢字的需求,在很多地方都會(huì)用到。同時(shí),可以看到響應(yīng)中的createTime和updateTime字段返回的時(shí)間信息不符合我們的閱讀習(xí)慣,修改json字符串中時(shí)間字段的格式,可以做如下配置:
7.1、在配置文件中添加配置:
spring.jackson.time-zone=GMT+8
7.2、在響應(yīng)的實(shí)體類時(shí)間字段上標(biāo)注@JsonFormat注解,并指定時(shí)間格式
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime;
7.3、完成以上兩個(gè)步驟后,重新訪問(wèn),時(shí)間格式就會(huì)變成我們所需要的樣子
總結(jié)
到此這篇關(guān)于SpringBoot項(xiàng)目中枚舉類型字段與前端和數(shù)據(jù)庫(kù)的交互方法的文章就介紹到這了,更多相關(guān)SpringBoot枚舉字段與前端數(shù)據(jù)庫(kù)交互內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java+OpenCV實(shí)現(xiàn)圖片中的人臉識(shí)別
這篇文章主要介紹了如何利用java?opencv實(shí)現(xiàn)人臉識(shí)別功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03springboot+dubbo實(shí)現(xiàn)時(shí)間輪算法
時(shí)間輪是一種高效利用線程資源進(jìn)行批量化調(diào)度的算法,本文主要介紹了springboot+dubbo實(shí)現(xiàn)時(shí)間輪算法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04JDK動(dòng)態(tài)代理的深入理解與實(shí)際應(yīng)用
這篇文章主要介紹了JDK動(dòng)態(tài)代理的深入理解與實(shí)際應(yīng)用,在Java的世界里,JDK的動(dòng)態(tài)代理是一項(xiàng)非常強(qiáng)大且實(shí)用的技術(shù),它為我們?cè)谶\(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建代理類提供了可能,從而實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象方法調(diào)用的靈活攔截和增強(qiáng),需要的朋友可以參考下2025-02-02FP-Growth算法的Java實(shí)現(xiàn)+具體實(shí)現(xiàn)思路+代碼
FP-Growth算法比Apriori算法快很多(但是卻比不上時(shí)間,how time slipped away)。在網(wǎng)上搜索后發(fā)現(xiàn)Java實(shí)現(xiàn)的FP-Growth算法很少,且大多數(shù)不太能理解):太菜。所以就自己實(shí)現(xiàn)了一下。這篇文章重點(diǎn)介紹一下我的Java實(shí)現(xiàn)2021-06-06java項(xiàng)目導(dǎo)出為.exe執(zhí)行文件的方法步驟
最近做了個(gè)項(xiàng)目,想要轉(zhuǎn)換成可執(zhí)行文件,那么java項(xiàng)目如何導(dǎo)出為.exe執(zhí)行文件,本文就介紹一下,主要使用jar2exe軟件,感興趣的可以了解一下2021-05-05SpringBoot this調(diào)用@Bean效果詳解
這篇文章主要介紹了在一個(gè)@Bean方法內(nèi),this調(diào)用同一個(gè)類的@Bean方法會(huì)有什么效果,我們可以通過(guò)bean的名稱、bean的類型或者bean的名稱+類型來(lái)獲取容器中的bean2023-02-02