nutz实现基于注解的校验器

基于注解的校验器,本文使用的是拦截器,并将拦截器交给nutz的ioc容器进行管理。思路是在前台发过来的请求,在被指定的函数接收参数前,会先被拦截,在拦截器中获取方法的参数,及需要校验的字段,校验类型,并将校验结果放到一个对象中,并将对象赋值给函数参数。本例子中前段只会传递一个参数json,所有需要的参数都封装在了json中,json格式如{id:1,name:"cai10"}

主要用到的类有以下几个:

1、首先是自定义注解:ValidationAnnotation

@Target(value={ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidationAnnotation {
 /**
  * 
  * @Title key需要校验的字段类型,如required等
  * @Description 
  * @author Administrator
  * @param 
  * @date 2015-5-14
  * @return String
  */
 ValidationType validationType() default ValidationType.REQUIRED;
 
 /**
  * 
  * @Title value
  * @Description 校验的字段
  * @author Administrator
  * @param 
  * @date 2015-5-14
  * @return String[]
  */
 String[] fieldValues() default {};
}

2、自定义校验类型:ValidationType

public enum ValidationType {
 /*必填*/
 REQUIRED
 //可以根据业务需要添加一些其他类型的校验
}

 3、错误信息汇总类,存储校验失败的信息:Errors

/**
 * 验证错误信息汇总类
 * 
 * @author QinerG(QinerG@gmail.com)
 */
public class Errors {
 /*
  * 存放错误信息的 map
  */
 private Map<String, String> errorMap = new TreeMap<String, String>();
 /**
  * @return 是否存在验证错误
  */
 public boolean hasError() {
  return errorMap.size() > 0;
 }
 
 /**
  * @return 返回存在错误的总数
  */
 public int errorCount() {
  return errorMap.size();
 }
 /**
  * 增加一个错误信息
  * 
  * @param fieldName
  *            存在错误的字段名
  * @param errorMessage
  *            错误的详细信息
  */
 public void add(String fieldName, String errorMessage) {
  errorMap.put(fieldName, errorMessage);
 }
 /**
  * 返回错误信息列表
  * @return
  */
 public Collection<String> getErrorsList() {
  return errorMap.values();
 }
 /**
  * 返回详细的错误信息列表,含验证错误的字段名和提示语
  * @return
  */
 public Map<String, String> getErrorsMap() {
  return errorMap;
 }
}

4、自定义的拦截器,并继承nutz的AbstractMethodInterceptor:ValidationInterceptor

/**
 * 基于注解的验证
 * @author Administrator
 *
 * 2015-5-14
 */
@IocBean//注意必须将此拦截器交给ioc管理
public class ValidationInterceptor extends AbstractMethodInterceptor{
 @Override
 public boolean beforeInvoke(Object obj, Method method, Object... args) {
  //定义 第一个参数为json, 第二个参数为Errors对象
  if(args.length ==2){
   String json = (String) args[0];
   NutMap map = Json.fromJson(NutMap.class, json);
   ValidationAnnotation anno = method.getAnnotation(ValidationAnnotation.class);
   ValidationType validator_type = anno.validationType();
   String[] values = anno.fieldValues();
   //如果是校验必填项
   if(ValidationType.REQUIRED.equals(validator_type)){
    //判断每个字段是否都存在于数组values中
    Errors es = null;
    for(String val:values){
     if(!map.containsKey(val)){
      args[2] = es= new Errors();
      es.add("required_string", "param ["+val+"] is requred, please check!......");
      break;
     }
    }
   }
   
  }
  return super.beforeInvoke(obj, method, args);
 }
}

5、使用校验器的函数如下:

@Aop("validationInterceptor")
 public void saveSupplierInfo(@Param("json")String json, Errors error) throws IOException{
  try {
   if(error.hasError()){
    result.setSuccessData(error.getErrorsList().toString());
   }else{
    boolean flag = supplierService.saveSupplierInfo(json);
    result.setSuccessData(flag);
   }
  } catch (Exception e) {
   e.printStackTrace();
   result.setExceptionData(e.getMessage());
   log.error(e.getMessage());
  }
  HttpKit.responseJson(result, getResponse());
 }

 

 可能有些设计不合理,望相互学习指教

 

转载于:https://my.oschina.net/u/1762811/blog/415241

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值