自定义注解
后端实现输入参数的字段长度校验,具体实现代码如下:
- 自定义注解、校验方法来实现校验
创建一个在配置的注解,只定义一个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);
}
- 使用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);
}
}
- 使用spring的注解校验,同上需要配合@Validated使用,@Validated的使用同上。