Springboot 使用 JSR 303 对 Controller 控制层校验及 Service 服务层 AOP 校验,使用消息资源文件对消息国际化 (3)

bean

/** * 待办类型0非项目任务1项目任务2问题3风险4评审待办问题 */ @TodoTypeValid(value = {"0", "1", "2"}, message = "{todo.todoType.insert}", groups = {C.Insert.class, S.Insert.class}) @TodoTypeValid(value = {"3", "4"}, message = "{todo.todoType.update}", groups = {C.Update.class, S.Update.class}) private String todoType;

自定义注解

@Documented @Constraint(validatedBy = {TodoTypeValid.TodoTypeValidFactory.class}) @Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Repeatable(TodoTypeValid.List.class) public @interface TodoTypeValid { String message() default "请输入正确的类型"; String[] value() default {}; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; class TodoTypeValidFactory implements ConstraintValidator<TodoTypeValid, String> { private String[] annotationValue; @Override public void initialize(TodoTypeValid todoStatusValid) { this.annotationValue = todoStatusValid.value(); } @Override public boolean isValid(String value, ConstraintValidatorContext context) { if (Arrays.asList(annotationValue).contains(value)) return true; return false; } } @Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented @interface List { TodoTypeValid[] value(); } }

@Repeatable(TodoTypeValid.List.class) 是 JDK8 支持的同一注解多次特性。

根据上面的同样也可以用在枚举类上

resources/todo.properties

todo.todoStatus.insert=新增时,状态只能是未开始。 todo.todoStatus.update=修改时,状态只能是进行中或已完成。

bean

/** * 待办状态0未开始1进行中2已完成 */ @TodoStatusValid(enums = {TodoStatus.NOT_STARTED}, message = "{todo.todoStatus.insert}", groups = {C.Insert.class, S.Insert.class}) @TodoStatusValid(enums = {TodoStatus.PROCESSING, TodoStatus.COMPLETED}, message = "{todo.todoStatus.update}", groups = {C.Update.class, S.Update.class}) private TodoStatus todoStatus;

自定义注解

@Documented @Constraint(validatedBy = {TodoStatusValid.TodoStatusValidFactory.class}) @Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Repeatable(TodoStatusValid.List.class) public @interface TodoStatusValid { String message() default "请输入正确的状态"; TodoStatus[] enums() default {}; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; class TodoStatusValidFactory implements ConstraintValidator<TodoStatusValid, TodoStatus> { private TodoStatus[] enums; @Override public void initialize(TodoStatusValid todoStatusValid) { this.enums = todoStatusValid.enums(); } @Override public boolean isValid(TodoStatus value, ConstraintValidatorContext context) { TodoStatus[] values = TodoStatus.values(); if (enums != null && enums.length != 0) { values = enums; } if (Arrays.asList(values).contains(value)) return true; return false; } } @Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented @interface List { TodoStatusValid[] value(); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyydg.html