1. 前言
在实际开发过程中,前端的下拉框或者单选按钮的内容通常的需要和后端匹配的,故一般会由后端将下拉框的内容或单选框的内容传给前端,而这些内容在后端一般是由枚举类存储的,如果后端直接返回枚举类,返回结果将会是枚举类的名称,而不是枚举类中的字段内容,这不是我们想要的结果。
2. 示例代码:
2.1 controller
层
package com.suhuamo.test.controller;
import com.suhuamo.test.enums.OpenStatusEnum;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author suhuamo
* @date 2024-05-26
* @slogan U R MY SPECIAL
* @description
*/
@RestController
@RequestMapping("/test")
public class TestController {
/**
* 获取当前开关状态
* @return OpenStatusEnum
* {@link com.suhuamo.test.enums.OpenStatusEnum}
* @version 1.0
* @author suhuamo
*/
@GetMapping("/open-status/now")
public OpenStatusEnum getOpenStatus()
{
return OpenStatusEnum.OPEN;
}
}
2.2 enum
代码
package com.suhuamo.test.enums;
import lombok.Getter;
/**
* @author suhuamo
* @date 2024-05-26
* @slogan 五秒钟内说出三个你爱的人的名字...5..4..3..2..1..你是不是没有说自己,也要爱自己哦。
* @description 开关状态枚举类
*/
@Getter
public enum OpenStatusEnum {
CLOSE(0, "关闭"),
OPEN(1, "开启");
/**
* 类型
*/
private final Integer type;
/**
* 描述
*/
private final String desc;
OpenStatusEnum(Integer type, String desc) {
this.type = type;
this.desc = desc;
}
public Integer getType() {
return type;
}
public String getDesc() {
return desc;
}
/**
* 根据类型获取枚举,当无该类型时,返回null
*
* @param type
* @return OpenStatus
*/
public static OpenStatusEnum getByType(Integer type) {
for (OpenStatusEnum itemEnum : OpenStatusEnum.values()) {
if (itemEnum.getType().equals(type)) {
return itemEnum;
}
}
return null;
}
}
3. 目前输出效果
在浏览器中输入:localhost:{端口}/test/open-status/now
即可访问。【我配置的项目端口是8888
,故端口输入的是8888
】
4. 解决办法
在枚举类上添加注解 @JsonFormat(shape = JsonFormat.Shape.OBJECT)
。
即枚举类的代码修改为:
package com.suhuamo.test.enums;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
/**
* @author suhuamo
* @date 2024-05-26
* @slogan 五秒钟内说出三个你爱的人的名字...5..4..3..2..1..你是不是没有说自己,也要爱自己哦。
* @description 开关状态枚举类
*/
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
@Getter
public enum OpenStatusEnum {
CLOSE(0, "关闭"),
OPEN(1, "开启");
/**
* 类型
*/
private final Integer type;
/**
* 描述
*/
private final String desc;
OpenStatusEnum(Integer type, String desc) {
this.type = type;
this.desc = desc;
}
public Integer getType() {
return type;
}
public String getDesc() {
return desc;
}
/**
* 根据类型获取枚举,当无该类型时,返回null
*
* @param type
* @return OpenStatus
*/
public static OpenStatusEnum getByType(Integer type) {
for (OpenStatusEnum itemEnum : OpenStatusEnum.values()) {
if (itemEnum.getType().equals(type)) {
return itemEnum;
}
}
return null;
}
}
5. 解决后输出效果
6. 复盘结论
- 出现问题的原因是因为在调用接口返回数据时,所有的对象都会被转换为JSON格式发送给前端,而枚举类的JSON格式的内容默认是枚举值的名称。
- 加上注解
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
就可以解决问题的原因是因为在转换JSON格式时,带有该注解可以将对象按照对象的形式进行序列化,即**<字段名称,字段内容>**
的键值对形式进行序列化。 - 附带的问题就是反序列化会出现问题,即存入
Redis
时没问题,但是取出有问题的。【故建议不要存Redis
】