1. 引言
2. 什么是自定义注解EnumValue
-
代码重用:将通用的校验逻辑封装在一个注解中,可以在多个地方使用。 -
代码清晰:通过注解的形式,校验逻辑更加直观和明确。 -
维护方便:当需要修改校验逻辑时,只需修改注解或校验器类即可,减少了重复代码的维护成本。
3. 创建枚举类
public enum Color {RED,GREEN,BLUE}
4. 创建自定义注解EnumValue
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = EnumValueValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface EnumValue {
Class<? extends Enum<?>> enumClass();
String message() default "Invalid value. This is not permitted.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
5.创建校验器EnumValueValidator
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;
public class EnumValueValidator implements ConstraintValidator<EnumValue, String> {
private EnumValue annotation;
@Override
public void initialize(EnumValue annotation) {
this.annotation = annotation;
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return true;
// Consider null as valid. Use @NotNull for null check.
}
Class<? extends Enum<?>> enumClass = annotation.enumClass();
return Arrays.stream(enumClass.getEnumConstants()).anyMatch(e -> e.name().equals(value));
}
}
6. 在Controller中使用自定义注解
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
@RestControllerpublic
class ColorController {
@GetMapping("/color")
public String getColor(@Valid @EnumValue(enumClass = Color.class) @RequestParam @NotNull String color) {
return "Selected color: " + color;
}
}
7. 总结
通过自定义注解EnumValue,我们可以在Spring应用中优雅地校验枚举值。这种方法不仅简化了校验逻辑,还提高了代码的可读性和可维护性。希望本文能帮助你在项目中更好地实现枚举值校验。如果你有任何问题或建议,欢迎在评论区留言。

点“在看”支持码农呀,谢谢啦

本篇文章来源于微信公众号: 新生代码农
微信扫描下方的二维码阅读本文

Comments NOTHING