javaweb后端优雅处理枚举
用了springboot-web自带的jackson注解
用了mybaits-plus注解
1.前端用json的格式,都要能正确解析参数(反序列化)传入后端
2.后端能正确把数值存到数据库(序列化)
3.后端给前端返回数值
代码示例:
/*** 视频状态枚举*/
@AllArgsConstructor
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum VideoStatusEnum {DRAFT(0, "草稿"),PUBLISHED(1, "发布"),OFFLINE(2, "下线");@JsonValue@Getter@EnumValueprivate final Integer code;@Getterprivate final String desc;/*** 根据 code 获取枚举*/public static VideoStatusEnum of(Integer code) {if (code == null) return null;for (VideoStatusEnum value : values()) {if (value.code.equals(code)) return value;}throw new IllegalArgumentException("No enum constant code:" + code);}
}
上面的已经解决了很多很多种情况了,90%了,这就可以了。
其他情况:(我不常用)
但是如果是get请求中的请求参数呢?他就不是json格式了
像这样,http://localhost:8080/test?videoStatus=0,这样就不行。
但是,http://localhost:8080/test?videoStatus=DRAFT,这样就行。(只能用DRAFT,不能是Draft、draft,这个大小写敏感的,会抛出异常)。
可以配上这个转换器
/*** String -> VideoStatusEnum* 同时兼容:* ?status=DRAFT 常量名* ?status=0 数字 code*/
@Component
public class StringToVideoStatusEnumConverter implements Converter<String, VideoStatusEnum> {@Overridepublic VideoStatusEnum convert(String source) {if (source == null || source.isEmpty()) {return null;}source = source.trim();// 1. 先按 code 整数试try {int code = Integer.parseInt(source);return VideoStatusEnum.of(code);} catch (NumberFormatException ignored) {// 2. 再按枚举名试return VideoStatusEnum.valueOf(source.toUpperCase());}}
}