自定义注解做数据验证

为了工作也为了更加深入了解掌握java注解的使用,决定自定义注解来实现数据验证。

最开始也考虑使用jsr-303规范来实现功能,但是对于开发人员来说比较累,因为要去实体类对象中添加验证字段注解,而且要进入到method当中。上一篇写的springmvc数据验证就是用jsr-303规范实现的。今天自定义了一下。也挺不错。

       自定义注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Validator {
public String[] fields();
public String bean() default "";
}

controller:

@RequestMapping(value="index3.do",method=RequestMethod.POST)
@ResponseBody
@Validator(fields={"username"+ValidatorConstant.NOT_NULL,"age"+ValidatorConstant.NOT_NULL},bean="myValidatorService")
public JSONObject index3(User user,HttpServletRequest request) {
JSONObject ret=new JSONObject();
ret.put("cuixuefeng", "25岁");
return ret;
}

其中fields是对应属性字段进行设置,bean是自定义Validator接口实现。

       过滤器:

public class MyHandler extends HandlerInterceptorAdapter implements ApplicationContextAware{

private static ApplicationContext ac;

/**
* 请求执行前拦截
* @param request 请求对象
* @param response 响应对象
* @param
*/
@Override
public boolean preHandle(HttpServletRequest request, 
HttpServletResponse response, Object handler) throws Exception {
HandlerMethod method=(HandlerMethod)handler;
Class<?> clazz=method.getBean().getClass();
String method_name=method.getMethod().getName();
return ValidatorUtil.getMethodInfo(clazz, method_name,request,ac);
}


/* (non-Javadoc)
* @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
*/
@Override
public void setApplicationContext(ApplicationContext arg0)
throws BeansException {
// TODO Auto-generated method stub
ac=arg0;
}
}

注解处理类:

public class ValidatorUtil {

public static boolean getMethodInfo(Class<?> clazz,String method_name,HttpServletRequest request,ApplicationContext ac){
Method[] methods = clazz.getDeclaredMethods();
    for(Method method :methods){
    if(method.getName().equals(method_name)){
    if(method.isAnnotationPresent(Validator.class)){
    Validator validator = method.getAnnotation(Validator.class);
    String[] fields=validator.fields();
    String bean=validator.bean();
    if(!verify(fields, request)){
    return false;
    }else{
    if(!"".equals(bean)){
    return ((IValidatorService)ac.getBean(bean)).verify(request);
    }
    }
        }
       }
   }
   return true;
}
 
public static boolean verify(String[] fields,HttpServletRequest request) {
for(String field:fields){
String[] params=field.split(":");
if(!verify(params[1], request.getParameter(params[0]))){
return false; 
}
}
return true;
}
 
public static boolean verify(String type,String param) {

if(type.equals(ValidatorConstant.NOT_NULL.substring(1))){ //校验非空
if(param==null||"".equals(param)){
return false;
}
}else if (type.equals(ValidatorConstant.NOT_ZERO.substring(1))) {//校验为0
if(param.equals("0")){
return false;
}
}else if (type.equals(ValidatorConstant.PHONE_NUM.substring(1))) {//校验手机号码11位
if(!(param.length()==11)){
return false;
}
}else if (type.equals(ValidatorConstant.ID_CARD.substring(1))) {//校验身份证合法
return IdCardUtil.verify(param);
}
return true;
}
 
}

注解类型参数:

public class ValidatorConstant {


/**
* 非空
*/
public static final String NOT_NULL=":NOT_NULL";

/**
* 不等于0
*/
public static final String NOT_ZERO=":NOT_ZERO";

/**
* 日期格式
*/
public static final String DATE_FORMAT=":DATE_FORMAT";

/**
* email格式
*/
public static final String EMAIL_FORMAT=":EMAIL_FORMAT";

/**
* 身份证校验
*/
public static final String ID_CARD=":ID_CARD";

/**
* 字符长度
*/
public static final String STR_LENGTH=":STR_LENGTH";

/**
* 正则表达式
*/
public static final String REG_EXP=":REG_EXP";

/**
* 手机号码校验
*/
public static final String PHONE_NUM=":PHONE_NUM";

}


以上实现其实是两个功能并列的关系,注解中接收两个参数:fields和bean,通过标签写入的fields可以实现基本校验,复杂的校验需要重新实现service进行实现。

接口:

public interface IValidatorService {

/**
* 校验(复杂校验方法)
* @param request 请求参数
* @return boolean 通过校验返回true否则返回false
*/
public boolean verify(HttpServletRequest request);

}


Java中,可以通过自定义注解来进行数据验证。下面是一个简单的例子: 1. 定义注解 ```java @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { String value() default ""; int minLength() default 0; int maxLength() default Integer.MAX_VALUE; String regex() default ""; } ``` 这个注解可以用在类的字段上,可以指定字段的值、最小长度、最大长度和正则表达式。 2. 使用注解 ```java public class User { @MyAnnotation(minLength = 3, maxLength = 10, regex = "[a-zA-Z0-9_]+") private String username; // getter and setter } ``` 在这个例子中,我们给User类的username字段加上了MyAnnotation注解,并指定了最小长度为3,最大长度为10,只能包含字母、数字和下划线。 3. 验证数据 ```java public class Validator { public static boolean validate(Object obj) throws IllegalAccessException { Class<?> clazz = obj.getClass(); for (Field field : clazz.getDeclaredFields()) { MyAnnotation annotation = field.getAnnotation(MyAnnotation.class); if (annotation != null) { field.setAccessible(true); String value = (String) field.get(obj); if (value == null || value.length() < annotation.minLength() || value.length() > annotation.maxLength() || !value.matches(annotation.regex())) { return false; } } } return true; } } ``` 这个Validator类可以用来验证任意对象的字段是否符合注解的要求。它通过反射获取对象的所有字段,并检查是否有MyAnnotation注解,然后根据注解的要求验证字段的值。 使用方法: ```java public static void main(String[] args) throws IllegalAccessException { User user = new User(); user.setUsername("abc_123"); boolean isValid = Validator.validate(user); System.out.println(isValid); // true } ``` 在这个例子中,我们创建了一个User对象,并将username设置为"abc_123",然后使用Validator类来验证这个对象的所有字段是否符合注解的要求。由于username符合要求,所以验证结果为true。 这样,我们就可以通过自定义注解来进行数据验证了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值