文档章节

注解验证参数的合法性

冰玉翔龙
 冰玉翔龙
发布于 2013/06/29 15:52
字数 394
阅读 245
收藏 3

一、定义需要验证的参数类型

package cn.com.songjy.annotation;

public enum ValidateType {

	NotNull,Length,Number
	
}

二、编写注解类

package cn.com.songjy.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface ValidateAnnotation {

	public ValidateType type();
	
	public String errorMsg();
	
	public int length() default 0;
	
}

三、验证参数

package cn.com.songjy.annotation;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

public class ValidateTools {

	public static boolean validate(Class obj, HttpServletRequest request){
		
		//Map<String, String> errors = (Map<String, String>) request.getAttribute("errors");
		Map<String, String> errors = new HashMap<String, String>();
		
		Field[] fields = obj.getDeclaredFields();
		
		for (Field field : fields) {
			
			//System.out.println(field.getName());//输出所有属性名称
			
			if(field.isAnnotationPresent(ValidateAnnotation.class)){//只处理包含注解为ValidateAnnotation的属性名称
				
				ValidateAnnotation validateUtil = field.getAnnotation(ValidateAnnotation.class);
				ValidateType type = validateUtil.type();
				
				if(ValidateType.NotNull == type)
					if(true == isNull(field.getName(), request))
						errors.put(field.getName(), validateUtil.errorMsg());
				
				if(ValidateType.Length == type)
					if(true == length(field.getName(), request, validateUtil.length()))
						errors.put(field.getName(), validateUtil.errorMsg());
				
				if(ValidateType.Number == type)
					if(true == isNumber(field.getName(), request))
						errors.put(field.getName(), validateUtil.errorMsg());
			}
		}
		
		return errors.size() == 0;
	}
	
	public static boolean isNull(String field, HttpServletRequest request){
		
		if(null==request || null==request.getParameter(field)) return true;
		
		if(0==request.getParameter(field).trim().length()) return true;
		
		return false;
	}
	
	public static boolean length(String field, HttpServletRequest request, int length){
		
		if(null==request || null==request.getParameter(field)) return true;
		
		if(length>request.getParameter(field).trim().length()) return true;
		
		return false;
	}
	
	public static boolean isNumber(String field, HttpServletRequest request){
		
		if(null==request || null==request.getParameter(field)) return true;
		
		try {
			Integer.parseInt(request.getParameter(field));
		} catch (NumberFormatException e) {
			e.printStackTrace();
			return true;
		}
		
		return false;
	}
}

四、在需验证的实体类中添加注解验证

package cn.com.songjy.model;

import cn.com.songjy.annotation.ValidateType;
import cn.com.songjy.annotation.ValidateAnnotation;

public class User {

	@ValidateAnnotation(type=ValidateType.Length, errorMsg="用户名长度不能小于1", length=1)
	private String username;
	
	@ValidateAnnotation(type=ValidateType.Number, errorMsg="年龄必须是数字")
	private int age;
	
	private String[] interest;
	
	public User(){}
	
	public User(String username, int age){
		this.username = username;
		this.age = age;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String[] getInterest() {
		return interest;
	}

	public void setInterest(String[] interest) {
		this.interest = interest;
	}
}

五、在Servlet(Action)调用验证

boolean success = ValidateTools.validate(User.class, request);

 SpringMVC 支持Hibernate Validator:http://my.oschina.net/u/241255/blog/297726

© 著作权归作者所有

共有 人打赏支持
冰玉翔龙
粉丝 3
博文 22
码字总数 2475
作品 0
杭州
高级程序员
私信 提问
加载中

评论(1)

hint
hint
蛮好的
使用Hibernate-Validation进行参数验证

在开发JAVA服务器端代码时,我们会遇到对外部传来的参数合法性进行验证,而hibernate-validator提供了一些常用的参数校验注解,我们可以拿来使用。 1.引入hibernate-validator依赖 <depende...

晨猫
09/18
0
0
基于springboot创建RESTful风格接口

基于springboot创建RESTful风格接口 RESTful API风格 特点: URL描述资源 使用HTTP方法描述行为。使用HTTP状态码来表示不同的结果 使用json交互数据 RESTful只是一种风格,并不是强制的标准 ...

JS_HCX
04/27
0
0
基于SpringAop 的统一验证

背景 在我们的项目实际开发中,由于使用dubbo框架,项目的所有的接口都是按照一定的规范来开发的,项目接口层的接口如下: 系统按照功能分包,所有的功能下面,都会有domain(VO数据),request...

顾志雄
2016/06/30
135
0
smart-doc功能使用介绍

smart-doc从8月份底开始开源发布到目前为止已经迭代了几个版本。在这里非常感谢那些敢于用smart-doc去做尝试并积极提出建议的社区用户。因此决定在本博客中重要说明下smart-doc的功能,包括使...

上官胡闹
10/22
0
0
微服务架构中整合网关、权限服务

前言:之前的文章有讲过微服务的权限系列和网关实现,都是孤立存在,本文将整合后端服务与网关、权限系统。安全权限部分的实现还讲解了基于前置验证的方式实现,但是由于与业务联系比较紧密,...

aoho
2017/12/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

微服务分布式事务实现

https://www.processon.com/view/link/5b2144d7e4b001a14d3d2d30

WALK_MAN
今天
2
0
《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
今天
4
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
今天
3
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
今天
3
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部