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([email protected])
 */
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());
 }

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

时间: 2024-10-27 11:38:20

nutz实现基于注解的校验器的相关文章

Spring3.0 入门进阶(6):自定义校验器

在Spring 3 中,对表单提交的校验方式比较常见的有两种 (1)基于注解:对于简单的属性校验,例如,长度,非空等,可以使用Spring,或是Hibernate自带的校验注解 (2)自定义校验类:对于复杂的业务校验可以自定义校验类,该类继承自org.springframework.validation.Validator (3)前台JS校验 增加表单校验功能大概分一下几个步骤 定义校验规则 基于注解的验证 只需要在相关的实体字段上添加校验注解即可,下面的例子基于hibernate的校验标签 i

04springMVC结构,mvc模式,spring-mvc流程,spring-mvc的第一个例子,三种handlerMapping,几种控制器,springmvc基于注解的开发,文件上传,拦截器,s

 1. Spring-mvc介绍 1.1市面上流行的框架 Struts2(比较多) Springmvc(比较多而且属于上升的趋势) Struts1(即将被淘汰) 其他 1.2  spring-mvc结构 DispatcherServlet:中央控制器,把请求给转发到具体的控制类 Controller:具体处理请求的控制器(配置文件方式需要配置,注解方式不用配置) handlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略 ModelAndView:服务

基于注解风格的Spring-MVC的拦截器

基于注解风格的Spring-MVC的拦截器 Spring-MVC如何使用拦截器,官方文档只给出了非注解风格的例子.那么基于注解风格如何使用拦截器呢? 基于注解基本上有2个可使用的定义类,分别是DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter: < bean class ="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerM

Spring学习笔记-springMVC基于注解的控制器(Demo)

springmvc的整体运行流程图: 基于@Controller和@RequestMapping是springmvc示例代码 在web.xml中配置springmvc核心分发器DispatcherServlet .... <servlet> <servlet-name>springmvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </

Struts2校验器

一.Struts2内建校验器 位于xwork-2.0.4.jar压缩包中( com.opensymphony.xwork2.validator.validators)有个文件default.xml ,该文件中定义了Struts2框架内建的校验器.default.xml文件定义了常用的校验器类型. <validators> <validator name="required" class="com.opensymphony.xwork2.validator.v

Spring7:基于注解的Spring MVC(下篇)

Model 上一篇文章<Spring6:基于注解的Spring MVC(上篇)>,讲了Spring MVC环境搭建.@RequestMapping以及参数绑定,这是Spring MVC中最基础也是最重要的内容,本篇文章继续讲讲Spring MVC中其余的知识点,先从Model开始. 前一篇文章比较详细地解读了数据从页面请求到服务器后台的一些细节,那么下一个要解决的问题就是数据如何从后台再次传回前台,答案就是这里要说的Model,关于Model在写例子之前我特别先说明三点: 1.Model本身是

基于注解的struts2+spring+hibernate集成

applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.spri

Spring声明式事务管理(基于注解方式实现)

----------------------siwuxie095 Spring 声明式事务管理(基于注解方式实现) 以转账为例 1.导入相关 jar 包(共 10 个包) (1)导入核心 jar 包和日志相关的 jar 包 (2)导入 JdbcTemplate 的 jar 包 (3)导入 MySQL 的 JDBC 驱动包 mysql-connector-java 下载链接: https://dev.mysql.com/downloads/connector/j/ (4)导入 AOP 的 jar

Spring6:基于注解的Spring MVC(上篇)

什么是Spring MVC Spring MVC框架是一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离.从这样一个角度来说,Spring MVC和Structs.Structs2非常类似.Spring MVC的设计是围绕DispatcherServlet展开的,DispatcherServlet负责将请求派发到特定的handler.通过可配置的hander mappings.view resolution.locale以及theme res