后端使用注解方式实现传入参数的字段长度校验

本文介绍了如何在后端实现自定义注解进行输入参数的字段长度校验,包括创建自定义注解、校验实现类以及在实体字段上的应用。此外,还提到了使用Hibernate和Spring的注解进行校验的方式,提供了便捷的字段长度限制和错误信息定制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义注解

后端实现输入参数的字段长度校验,具体实现代码如下:

  1. 自定义注解、校验方法来实现校验
    创建一个在配置的注解,只定义一个value方法。
@Target({ElementType.FIELD, ElementType.TYPE})
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface CoLen {
	
	int value();

}

定义字段校验实现类

创建一个字段长度校验的实现类:

public class ColLenCheck {

	public static void checkLen(Object obj) throws ValidationException {
		
		if (null != obj){
            Class<? extends Object> cls = obj.getClass();
            Field[] fields = cls.getDeclaredFields();
            checkField(obj, fields);
            cls = cls.getSuperclass();//获取父类,如果实体没有继承父类则不需获取。
            if (!"java.lang.Object".equals(cls.getName())) {//过滤Object父类
            	Field[] supFields = cls.getDeclaredFields();//获取父类所有属性
            	checkField(obj, supFields);
			}
        }
	}

	private static void checkField(Object obj, Field[] fields)
			throws ValidationException {
		for (int i = 0; i < fields.length; i++){
		    try{
		        Field field = fields[i];
		        Annotation[] anns = field.getAnnotations();//获取字段的所有注解
		        CoLen dataLen = null;
		        for (Annotation ann : anns){
		            if (ann instanceof CoLen)
		                dataLen = (CoLen) ann;
		        }
		        if (null != dataLen){
		            field.setAccessible(true);
		            String name = field.getName();
		            Object value = field.get(obj);
		            int len = dataLen.value();
		            int vaLen = 0;
		            String data = null;
		            if (null != value && value instanceof String){
		                data = (String) value;
		                vaLen = data.length();
		            }
		            if (vaLen > len){
		                throw new ValidationException("error info: length exceed " + len + ",error field :" + name);//抛出自定义异常
		            }
		        }
		    }catch (IllegalAccessException e){
		        e.printStackTrace();
		    }
		}
	}
}

使用自定义注解

在实体字段上添加注解,指定长度

@CoLen(50)
private String apiName;

可在controller层对传入的参数进行校验,调用长度校验实现类,对传入的对象进行校验:这里需要进行try-catch,因为校验会抛出异常。

try {
  	ColLenCheck.checkLen(info);//info是前端传入的对象实体
	return userService.add(info);
} catch (ValidationExceptione) {
	logger.error("用户添加异常", e);
}
  1. 使用hibernate定义的长度校验注解
    此种方式比较便捷,可以直接给字段上配置注解,指定最大长度、返回消息即可,实现如下:
    需要配合@Validated使用,在controller层校验的实体前加上此注解即可。也可以引入分组如@Validated({Insert.class})、@Validated({Update.class}),表示添加、编辑时校验,或如下在实体字段上配置分组,可以配置此字段在新增或编辑时校验,如果不配置则全部请求都会校验。
    @Validated使用只需引入spring-boot-starter-web包即可。
@Length(max = 255,message = "apiName length can`t execeed 255",groups = {Update.class, Insert.class})
@ApiModelProperty(value = "api名称",name = "sn",example = "充电桩分页")
private String apiName;
public ResponseUtils add(@RequestBody @Validated UserInfo info) throws ServiceException {
	try{
		userService.add(info);
	}catch(ServiceException e){
		log.error("添加异常",e);
	}
}
  1. 使用spring的注解校验,同上需要配合@Validated使用,@Validated的使用同上。
    在这里插入图片描述
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值