文档章节

nutz实现基于注解的校验器

梦蝶飘雪
 梦蝶飘雪
发布于 2015/05/15 11:24
字数 702
阅读 146
收藏 4

基于注解的校验器,本文使用的是拦截器,并将拦截器交给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());
 }

 

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

 

© 著作权归作者所有

梦蝶飘雪
粉丝 5
博文 28
码字总数 9016
作品 0
东城
程序员
私信 提问
Wendal/nutzmore

nutzmore Nutz的插件与扩展 各种官方插件的集合 每个插件都有自己的文件夹,均为maven module, 请按需获取. org.nutz填nutz插件名1.r.59 快照版地址 https://jfrog.nutz.cn/artifactory/snap...

Wendal
2015/08/29
0
0
Nutz MVC 识别后缀

在nutz的使用过程中我们会发现nutz其实是过滤后缀后才会再去通过@At注解寻找合适的入口。但是很多时候我们是需要区分这个后缀的。那么该怎么实现呢? 其实nutz提供了一个@UrlMappingBy注解。在...

追梦的南瓜
2016/01/16
134
0
NUTZ 框架下的企业级项目脚手架--NUTZ-ONEKEY

NUTZ-ONEKEY NUTZ一键脚手架 概述 github地址 https://github.com/Kerbores/NUTZ-ONEKEY 仓库 <repositories> 目标 提供开箱即用的企业级开发平台 提供企业开发中常见的组件和交互示例 提供高...

Kerbores
2016/06/30
3.8K
6
Spring Boot 2.X 如何添加拦截器?

最近使用SpringBoot2.X搭建了一个项目,大部分接口都需要做登录校验,所以打算使用注解+拦截器来实现,在此记录下实现过程。 一、实现原理 1. 自定义一个注解@NeedLogin,如果接口需要进行登...

花漾年华
04/19
13
0
SpringBoot 中使用声明式注解简化参数校验

1.先看下最终效果 当我们发起一个POST /users的请求期望新增一个用户 @PostMapping("/users")public void addUser(@Valid @RequestBody User user) { } 假设携带以下JSON数据作为请求参数,但...

秋田君
2018/04/15
4.3K
14

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
5
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部