当前位置:网站首页>Enum + Validation 的个人最佳实践 demo 分享
Enum + Validation 的个人最佳实践 demo 分享
2022-07-07 15:39:00 【小水牛...】
前言
很多场景中我们需要校验前端传来的参数是否属于某个 Enum
值,分享一段个人最佳实践的 demo
:
Enum
的最简声明@OfEnum & OfEnumValidator
Test suite
Enum 声明
通常 Enum
的声明是映射到对应的 DB
字段,个人实践是直接以 Enum Name
对应具体值,无需在 Enum
里包含释义信息等,比如 SexEnum
声明为 man woman
而不是类似 男("man") 女("woman")
,这样也方便后续 Validator
类的编写
public enum SexEnum {
man
, woman
;
}
@OfEnum
@Constraint(
validatedBy = {
OfEnumValidator.class }
)
@Target({
ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface OfEnum {
Class<?> enumType();
String message() default "目标值必须是 ${enumType.simpleName} 类型的枚举值";
Class<?>[] groups() default {
};
Class<? extends Payload>[] payload() default {
};
}
该注解主要用于字段、参数上结合对应的 OfEnumValidator
执行校验
@Constraint
注解声明对应的OfEnumValidator
- 属性
enumType
声明对应的枚举类型 message
中引用EL
表达式输出合理的校验信息
OfEnumValidator
public class OfEnumValidator implements ConstraintValidator<OfEnum, String> {
private List<String> enums;
// 枚举值初始化
@Override
public void initialize(OfEnum constraintAnnotation) {
enums = Optional.ofNullable(constraintAnnotation)
.map(OfEnum::enumType)
.filter(Class::isEnum)
.map(Class::getEnumConstants)
.map(arr -> Arrays.stream(arr)
.map(Object::toString)
.collect(Collectors.toList()))
.orElse(new ArrayList<>());
}
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
return !ObjectUtils.isEmpty(enums) && enums.contains(s);
}
}
OfEnumValidator
类负责执行 @OfEnum
注解对应的校验
- 基于指定的枚举类来初始化
enums
属性,直接基于toString
方法,因此前文推荐Enum
的简单声明 isValid
进行校验
Test
public class OfEnumTest {
ApplicationContextRunner runner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(ValidationAutoConfiguration.class));
@Validated
static class Handler {
public void handle(@OfEnum(enumType = SexEnum.class) String sex) {
}
}
static class Config {
@Bean
public Handler handler() {
return new Handler();
}
}
@Test
public void test() {
runner.withUserConfiguration(Config.class)
.run(context -> {
Handler bean = context.getBean(Handler.class);
bean.handle("man");
assertThatThrownBy(() -> bean.handle("error"))
.isInstanceOf(ConstraintViolationException.class)
.hasMessage("handle.sex: 目标值必须是 SexEnum 类型的枚举值");
});
}
}
针对 @OfEnum
注解的测试类:
- 基于
ApplicationContextRunner
编写,很好用的测试辅助类,之前有分享 - 可以看到,当传入
SexEnum
成员之外的值时,会抛出校验异常
总结
以上就是个人 Enum + Validation
的最佳实践分享
边栏推荐
- 【Seaborn】组合图表:FacetGrid、JointGrid、PairGrid
- How to implement safety practice in software development stage
- Seaborn data visualization
- Sator launched Web3 game "satorspace" and launched hoobi
- Smart logistics platform: make overseas warehouses smarter
- Sator launched Web3 game "satorspace" and launched hoobi
- PLC:自动纠正数据集噪声,来洗洗数据集吧 | ICLR 2021 Spotlight
- Sator a lancé le jeu web 3 "satorspace" et a lancé huobi
- SIGGRAPH 2022最佳技术论文奖重磅出炉!北大陈宝权团队获荣誉提名
- 【饭谈】Web3.0到来后,测试人员该何去何从?(十条预言和建议)
猜你喜欢
[video / audio data processing] Shanghai daoning brings you elecard download, trial and tutorial
责任链模式 - Unity
测试用例管理工具推荐
The top of slashdata developer tool is up to you!!!
【TPM2.0原理及应用指南】 16、17、18章
自定义View必备知识,Android研发岗必问30+道高级面试题
PLC: automatically correct the data set noise, wash the data set | ICLR 2021 spotlight
What is cloud computing?
鲲鹏开发者峰会2022 | 麒麟信安携手鲲鹏共筑计算产业新生态
PLC:自动纠正数据集噪声,来洗洗数据集吧 | ICLR 2021 Spotlight
随机推荐
MySQL implements the query of merging two fields into one field
【Seaborn】组合图表:FacetGrid、JointGrid、PairGrid
[Seaborn] implementation of combined charts and multi subgraphs
Lex & yacc of Pisa proxy SQL parsing
麒麟信安云平台全新升级!
【饭谈】如何设计好一款测试平台?
Notes on installing MySQL in centos7
【Seaborn】组合图表:PairPlot和JointPlot
[Seaborn] combination chart: pairplot and jointplot
第二十四届中国科协湖南组委会调研课题组一行莅临麒麟信安调研考察
Flask搭建api服务
99%的人都不知道|私有化部署还永久免费的即时通讯软件!
LeetCode 1043. Separate the array to get the maximum and daily questions
【TPM2.0原理及应用指南】 9、10、11章
从DevOps到MLOps:IT工具怎样向AI工具进化?
Problems encountered in Jenkins' release of H5 developed by uniapp
让保险更“保险”!麒麟信安一云多芯云桌面中标中国人寿, 助力金融保险信息技术创新发展
The mail server is listed in the blacklist. How to unblock it quickly?
浅谈 Apache Doris FE 处理查询 SQL 源码解析
The computer cannot add a domain, and the Ping domain name is displayed as the public IP. What is the problem? How to solve it?