自定义枚举类型检查

/**
 * 工单状态,使用字典:order_item_state
 */
@CheckEnum(nullAble = true, enumType = OrderItemStateEnum.class)
private String workState;

注解类

package com.gdyunst.core.tool.validation;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * 校验是否是状态枚举中的项
 */
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {CheckEnumValidation.class})
public @interface CheckEnum {

	String message() default "请输入字典中的状态类型";

	/**
	 * 是否可以为空,true可以为空,当配置true并且传的值也是空,那就不做校验
	 * @return
	 */
	boolean nullAble() default false;

	/**
	 * 枚举类型
	 * @return
	 */
	Class enumType();

	/**
	 * 枚举中的方法名称,get方法,如:getType
	 * @return
	 */
	String methodName() default "getType";

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

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

配置类

package com.gdyunst.core.tool.validation;

import cn.hutool.core.util.StrUtil;
import com.gdyunst.core.tool.util.EnumUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * 参数必须是状态字典校验
 */
public class CheckEnumValidation implements ConstraintValidator<CheckEnum, String> {
	/**
	 * 获取配置中是否为空
	 */
	private Class enumType;

	private boolean nullAble;

	private String methodName;

	@Override
	public void initialize(CheckEnum checkEnum) {
		enumType = checkEnum.enumType();
		nullAble = checkEnum.nullAble();
		methodName = checkEnum.methodName();
	}

	/**
	 * 传递的字典类型参数值
	 * @param enumValue
	 * @param constraintValidatorContext
	 * @return
	 */
	@Override
	public boolean isValid(String enumValue, ConstraintValidatorContext constraintValidatorContext) {
		// 配置了允许为空并且该值也是空,那就不去校验格式
		if (nullAble && StrUtil.isBlank(enumValue)) {
			return true;
		}

		if(StrUtil.isBlank(enumValue)){
			constraintValidatorContext.disableDefaultConstraintViolation();
			constraintValidatorContext.buildConstraintViolationWithTemplate("请输入字典字段参数")
					.addConstraintViolation();
			return false;
		}

		if (StrUtil.isBlank(methodName)) {
			constraintValidatorContext.disableDefaultConstraintViolation();
			constraintValidatorContext.buildConstraintViolationWithTemplate("枚举中的字段必须配置")
					.addConstraintViolation();
			return false;
		}

		if (enumType == null) {
			constraintValidatorContext.disableDefaultConstraintViolation();
			constraintValidatorContext.buildConstraintViolationWithTemplate("枚举对象必须配置")
					.addConstraintViolation();
			return false;
		}

		Object stateEnum = EnumUtils.getEnumByLambda(enumValue, enumType, methodName);

		if(stateEnum == null) {
			constraintValidatorContext.disableDefaultConstraintViolation();
			constraintValidatorContext.buildConstraintViolationWithTemplate(String.format("请输入系统字典: %s 中的枚举值", enumType.getSimpleName()))
					.addConstraintViolation();
			return false;
		}

		return true;
	}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 枚举类型(enum)是C++中的一种数据类型,用于定义一些具有离散取值的变量。在枚举类型中,我们可以为每个具体取值指定一个符号名称(枚举常量),然后使用这些符号名称来代替具体的取值。枚举类型常用于程序中需要描述一些状态或选项的情况,比如星期几、颜色、选项等。 下面是枚举类型的基本语法: ``` enum 枚举类型名 { 枚举常量1, 枚举常量2, ... }; ``` 其中,枚举类型名是我们定义的枚举类型的名称,枚举常量是我们为每个具体取值指定的符号名称。 举个例子,我们可以定义一个星期枚举类型,如下所示: ``` enum Weekday { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; ``` 在定义了枚举类型后,我们就可以使用枚举类型中定义的符号名称来代替具体的取值。例如,我们可以定义一个变量并将其赋值为枚举类型中的某个符号名称,如下所示: ``` Weekday today = Monday; ``` 在上面的代码中,我们定义了一个变量today,并将其赋值为Monday,这里的Monday是枚举类型Weekday中定义的一个符号名称。 需要注意的是,枚举类型中定义的符号名称默认情况下是从0开始自动编号的,也就是说,Monday的取值为0,Tuesday的取值为1,以此类推。如果需要手动指定枚举常量的取值,可以在定义时进行赋值,如下所示: ``` enum Color { Red = 1, Green = 2, Blue = 4 }; ``` 在上面的代码中,我们定义了一个Color枚举类型,并手动指定了Red、Green和Blue三个枚举常量的取值分别为1、2和4。 ### 回答2: 枚举类型是一种表示有限组合的数据类型。它可以用来定义一组具有相似属性的常量值。枚举类型的定义包括关键字enum和枚举值列表。 枚举类型的用法有以下几个方面: 1. 定义枚举类型:使用enum关键字加上一个标识符来定义一个新的枚举类型枚举类型的名称通常采用大写开头的驼峰命名法。 2. 定义枚举值:在枚举类型的定义中,可以列举多个合法的枚举值。每个枚举值可以有一个可选的关联值,用于表示该枚举值的额外信息。 3. 访问枚举值:使用点语法来访问枚举类型中的各个枚举值。枚举类型的名称加上一个点和具体的枚举值即可。 4. 关联值:枚举值可以有关联的值,用于表示该枚举值的额外信息。关联值的类型可以是任意类型,包括基本类型和自定义类型。 5. 原始值:在枚举类型的定义中,可以为每个枚举值指定一个原始值。原始值可以是整数、浮点数、字符串等类型。 6. 使用switch语句匹配枚举值:可以使用switch语句来匹配枚举类型中的各个枚举值,并根据不同的枚举值执行相应的代码块。 通过正确使用枚举类型,可以使代码更加清晰和可读。它可以提供一种更好的组织和管理常量值的方式,并且可以减少代码中的错误。枚举类型的使用可以使代码更加简洁和易于理解,提高代码的可维护性和可扩展性。 ### 回答3: 枚举类型(enum)是一种在编程语言中用于定义一组命名常量的特定类型。通常情况下,枚举类型用于定义一些特定的状态、选项或者分类。 枚举类型的用法主要有以下几个方面: 1. 定义枚举常量:通过enum关键字可以创建一个枚举类型,并且在其中定义一些常量。这些常量都具有相同的类型,并且可以通过名称来引用。例如,可以定义一个颜色的枚举类型,其中包含了红色、绿色、蓝色等常量。 2. 类型安全:枚举类型在编译期间会进行类型检查,确保只能使用定义的常量值。这样可以避免程序中出现拼写错误或者使用不合规的值。 3. 使用枚举常量:可以使用枚举常量来表示变量的取值范围,或者作为条件判断的依据。例如,可以定义一个星期的枚举类型,然后根据不同的枚举常量来执行不同的操作。 4. 迭代枚举常量:枚举类型通常可以通过迭代的方式获取所有定义的常量值。这样可以方便地遍历和处理所有可能的取值。 5. 枚举类型可以具有属性和方法:枚举类型可以定义额外的属性和方法,用于扩展其功能。例如,可以为颜色枚举类型定义一个方法,用于获取对应颜色的RGB值。 总的来说,枚举类型提供了一种更加直观和可读性更高的方式来定义一组有限的常量。通过使用枚举类型,可以使程序更加易读、易维护,并且减少错误发生的可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值