JAVA入参注解方式校验枚举类

废话不多说,直接上代码

Controller层



public Result<Void> save(@Valid @RequestBody GameResult gameResult){
    gameService.saveGameResult(gameResult);
    return Result.success();
}

入参


public class GameResult{

    @ApiModuleProperties("用户ID")
    private String userId;

    @Enum(value = GameResultEnum.class, message = "游戏结果类型错误!1-胜利;0-失败;-1-逃跑")
    @ApiModuleProperties("游戏结果")
    private Integer result;

}

自定义Enum注解

@Target(FIELD)
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = EnumValidator.class)
public @interface Enum {

    String DEFAULT_MESSAGE = "不在指定枚举值范围内\n";

    String message() default DEFAULT_MESSAGE;

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    Class<?> value();

    String enumMethod() default "getKey";
}

校验类

@Slf4j
public class EnumValidator implements ConstraintValidator<Enum, Integer>{

    private Set<Integer> set = new HashSet<>();

    @Override
    public void initialize(Enum constraintAnnotation){

        if(null == constraintAnnotation){
        
            return;
        
        }

        Class<?> clazz = constraintAnnotation.value();
        
        String methodName = constraintAnnotation.enumMethod();

        if(clazz.isEnum()){
            
            Method getCode;
            
            Object[] objs = clazz.getEnumConstants();

            try{
                
                getCode = clazz.getMehtod(methodName);
        
                if(null == getCode){
                    
                    throw new RuntimeException("enum method can not be null, methodName:" + methodName);
              
                  }

                for(Object obj : objs){
                    
                    Integer code = (Integer)getCode.invoke(obj);

                    set.add(code);

                }

            }catch(Exception e){

                log.error("EnumValitor error", e);
                
                throw new RuntimeException(e);

            }
        }
        
    }

}

枚举类

public enum GameResultEnum{


    WIN(1),

    LOSE(0),

    RUN_AWAY(-1);

    
    private Integer key;


    GameResultEnum(Integer key){
        
        this.key = key;

    }

    public Integer getKey(){

        return key;

    }

}

目前这套代码只支持整数类型枚举值,如果是其他类型的枚举值需要调整一下,只是给各位大佬提供一个思路。

以上。

### Java校验枚举值的注解方法 在 Java 的 Bean Validation 框架中,默认提供的注解(如 `@NotNull` 或 `@Pattern`)通常不适用于直接验证枚举类型。这是因为框架本身并未提供专门针对枚举类型的内置约束机制[^3]。 #### 自定义注解实现枚举校验 为了满足这一需求,可以通过创建自定义注解并结合相应的验证器类来完成对枚举类型校验。以下是具体实现方式: 1. **定义自定义注解** 创建一个新的注解,例如 `@EnumValue`,并通过元注解指定其作用范围以及关联的验证逻辑。 ```java import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = EnumValidator.class) // 关联验证器 public @interface EnumValue { String message() default "Invalid enum value"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; // 定义允许的枚举类 Class<? extends Enum<?>> enumClass(); } ``` 2. **编写验证器类** 实现具体的验证逻辑,确保传的值属于目标枚举类型中的合法成员。 ```java import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class EnumValidator implements ConstraintValidator<EnumValue, Object> { private Enum<?>[] values; @Override public void initialize(EnumValue constraintAnnotation) { this.values = constraintAnnotation.enumClass().getEnumConstants(); // 获取所有枚举常量 if (this.values == null || this.values.length == 0) { throw new IllegalArgumentException("The given enum is empty!"); } } @Override public boolean isValid(Object value, ConstraintValidatorContext context) { if (value == null) { // 如果字段可以为空,则返回 true return true; } for (Enum<?> e : values) { if (e.name().equals(value.toString())) { // 验证输值是否匹配任意枚举名称 return true; } } return false; // 输值非法 } } ``` 3. **应用自定义注解** 将新定义的注解应用于需要校验的字段上。 ```java public enum CustomerType { INDIVIDUAL, BUSINESS } public class Customer { @EnumValue(enumClass = CustomerType.class, message = "Unsupported customer type") private String customerType; // Getter and Setter methods... } ``` 4. **测试验证功能** 使用 Hibernate Validator 等工具运行验证流程,确认枚举值的有效性。 ```java import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator; import javax.validation.Validation; import javax.validation.ValidatorFactory; import javax.validation.Validator; import javax.validation.ConstraintViolation; public class MainApp { public static void main(String[] args) { ValidatorFactory factory = Validation.byDefaultProvider() .configure() .messageInterpolator(new ResourceBundleMessageInterpolator()) .buildValidatorFactory(); Validator validator = factory.getValidator(); Customer customer = new Customer(); customer.setCustomerType("INVALID_TYPE"); Set<ConstraintViolation<Customer>> violations = validator.validate(customer); for (ConstraintViolation<Customer> violation : violations) { System.out.println(violation.getMessage()); // 输出: Unsupported customer type } } } ``` 以上代码展示了如何通过自定义注解和验证器实现对枚举类型校验。这种方法不仅灵活而且易于扩展,能够适应多种业务场景的需求[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值