当前位置:网站首页>Enum + Validation 的个人最佳实践 demo 分享
Enum + Validation 的个人最佳实践 demo 分享
2022-07-07 15:39:00 【小水牛...】
前言
很多场景中我们需要校验前端传来的参数是否属于某个 Enum 值,分享一段个人最佳实践的 demo:
Enum的最简声明@OfEnum & OfEnumValidatorTest 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 的最佳实践分享
边栏推荐
猜你喜欢

Test case management tool recommendation

Devops' operational and commercial benefits Guide

redis主从、哨兵主备切换搭建一步一步图解实现

PLC:自动纠正数据集噪声,来洗洗数据集吧 | ICLR 2021 Spotlight

The process of creating custom controls in QT to encapsulating them into toolbars (II): encapsulating custom controls into toolbars

AI来搞财富分配比人更公平?来自DeepMind的多人博弈游戏研究

鲲鹏开发者峰会2022 | 麒麟信安携手鲲鹏共筑计算产业新生态

【网络攻防原理与技术】第5章:拒绝服务攻击

责任链模式 - Unity

麒麟信安操作系统衍生产品解决方案 | 存储多路径管理系统,有效提高数据传输可靠性
随机推荐
Leetcode brush questions day49
【TPM2.0原理及应用指南】 9、10、11章
centos7安装mysql笔记
From Devops to mlops: how do it tools evolve to AI tools?
How to implement safety practice in software development stage
Skimage learning (3) -- gamma and log contrast adjustment, histogram equalization, coloring gray images
LeetCode 1774. The dessert cost closest to the target price is one question per day
Sator推出Web3游戏“Satorspace” ,并上线Huobi
智慧物流平台:让海外仓更聪明
QT picture background color pixel processing method
Sator推出Web3遊戲“Satorspace” ,並上線Huobi
Pychart ide Download
【Seaborn】组合图表:PairPlot和JointPlot
数值 - number(Lua)
从DevOps到MLOps:IT工具怎样向AI工具进化?
Skimage learning (3) -- adapt the gray filter to RGB images, separate colors by immunohistochemical staining, and filter the maximum value of the region
Several best practices for managing VDI
Skimage learning (2) -- RGB to grayscale, RGB to HSV, histogram matching
Sator launched Web3 game "satorspace" and launched hoobi
Establishment of solid development environment