java后台验证不能为空_java validation 后台参数验证的使用详解
一、前言
在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节。比如参数不能为null,email那么必须符合email的格式,如果手动进行if判断或者写正则表达式判断无意开发效率太慢,在时间、成本、质量的博弈中必然会落后。所以把校验层抽象出来是必然的结果,下面说下几种解决方案。
二、几种解决方案
1、struts2的valid可以通过配置xml,xml中描述规则和返回的信息,这种方式比较麻烦、开发效率低,不推荐
2、validation bean 是基于jsR-303标准开发出来的,使用注解方式实现,及其方便,但是这只是一个接口,没有具体实现.Hibernate Validator是一个hibernate独立的包,可以直接引用,他实现了validation bean同时有做了扩展,比较强大 ,实现图如下:
点此查看中文官方手册
3、oval 是一个可扩展的java对象数据验证框架,验证的规则可以通过配置文件、Annotation、POJOs 进行设定。可以使用纯 Java 语言、javascript 、Groovy 、BeanShell 等进行规则的编写,本次不过多讲解
三、bean validation 框架验证介绍
bean validation 包放在maven上维护,最新包的坐标如下:
javax.validation
validation-api
1.1.0.Final
点击这里查看最新的坐标地址
下载之后打开这个包,有个package叫constraints,里面放的就是验证的的注解:
下面开始用代码实践一下:
1、定义一个待验证的bean:Student.java
package com.shishang;
import javax.validation.constraints.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
public class Student implements Serializable {
@NotNull(message = "名字不能为空")
private String name;
@Size(min = 6,max = 30,message = "地址应该在6-30字符之间")
private String address;
@DecimalMax(value = "100.00",message = "体重有些超标哦")
@DecimalMin(value = "60.00",message = "多吃点饭吧")
private BigDecimal weight;
private String friendName;
@AssertTrue
private Boolean isHaveFriend(){
return friendName != null?true:fwww.cppcns.comalse;
}
@Future(message = "生日必须在当前实践之前")
private Date birthday;
@Pattern(regexp = "^(.+)@(.+)$",message = "邮箱的格式不合法")
private String email;
2、测试类:StudentTest.java
package com.use;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
public class StudentTest implements Serializable {
public static void main(String[] args) {
Student xiaoming = getBean();
List validate = validate(xiaoming);
validate.forEach(row -> {
System.out.println(row.toString());
});
}
private static Student getBean() {
Student bean = new Student();
bean.setName(null);
bean.setAddress("北京");
bean.setBirthday(new Date());
bean.setFriendName(null);
bean.setWeight(new BigDecimal(30));
bean.setEmail("xiaogangfan163.com");
return bean;
}
private static ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
public static List validate(T t) {
Validator validaYtIDqItigotor = factory.getValidator();
Set> constraintViolations = validator.validate(t);
List messageList = new ArrayList<>();
for (ConstraintViolation constraintViolation : constraintViolations) {
messageList.add(constraintViolation.getMessage());
}
return messageList;
}
}
3、运行testValidation()方法,输处如下:
地址应该在6-30字符之间
邮箱的格式不合法
生日必须在当前时间之前
多吃点饭吧
名字不能为空
4、总结
像@NotNull、@Size等比较简单也易于理解,不多说
因为bean validation只提供了接口并未实现,使用时需要加上一个provider的包,例如hibernate-validator
@Pattern 因为这个是正则,所以能做的事情比较多,比如中文还是数字、邮箱、长度等等都可以做
@AssertTRue 这个与其他的校验注解有着本质的区别,这个注解适用于多个字段。例子中isHaveFriend方法依赖friendName字段校验
验证的api是经过我加工了一下,这样可以批量返回校验的信息
有时我们需要的注解可能没有提供,这时候就需要自定义注解,写实现类,下面说一下自定义注解的使用
四、自定义bean 编程客栈validation 注解验证
有时框架自带的没法满足我们的需求,这时就需要自己动手丰衣足食了,恩恩 ,这个不难,下面说下。
这个例子验证字符串是大写还是小写约束标注,代码如下:
1、枚举类型CaseMode, 来表示大写或小写模式
package com.defineconstrain;
/**
* created by xiaogangfan
* on 16/10/25.
*/
public enum CaseMode {
UPPER,
LOWER;
}
2、定义一个CheckCase的约束标注
package com.defineconstrain;
/**
* created by xiaogangfan
* on 16/10/25.
*/
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = CheckCaseValidator.class)
@Documented
public @interface CheckCase {
String message() default "{com.mycompany.constraints.checkcase}";
Class>[] groups() default {};
Class extends Payload>[] payload() default {};
CaseMode value();
}
3、约束条件CheckCase的验证器
package com.defineconstrain;
/**
* created by xiaogangfan
* on 16/10/25.
*/
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class CheckCaseValidator implements ConstraintValidator {
private CaseMode caseMode;
public void initialize(CheckCase constraintAnnotation) {
this.caseMode = constraintAnnotation.value();
}
public boolean isValid(String object, ConstraintValidatorContext constraintContext) {
www.cppcns.com if (object == null)
return true;
if (caseMode == CaseMode.UPPER)
return object.equals(object.toUpperCase());
else
return object.equals(object.toLowerCase());
}
}
4、在Student.java中增加一个属性
@CheckCase(value = CaseMode.LOWER,message = "名字的拼音需要小写")
private String spellName;
5、在StudentTest.java的getBean()方法中增加一行
bean.setSpellName("XIAOGANGFAN");
6、运行testValidation()方法,输处如下:
地址应该在6-30字符之间
邮箱的格式不合法
生日必须在当前时间之前
多吃点饭吧
名字的拼音需要小写
名字不能为空
7、说明新增的约束生效了,大功告成
代码下载地址:git@github.com:xiaogangfan/vaidation.git
命令: git clone git@github.com:xiaogangfan/vaidation.git
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
本文标题: java validation 后台参数验证的使用详解
本文地址: http://www.cppcns.com/ruanjian/java/207528.html
java后台验证不能为空_java validation 后台参数验证的使用详解相关推荐
- java break 在if 中使用_java中使用国密SM4算法详解
前言 上次总结了一下加密算法的分类(加密算法有集中形式,各有什么不同?),现在我们用java语言实现一下SM4:无线局域网标准的分组数据算法.对称加密,密钥长度和分组长度均为128位. ps:我们既可 ...
- java中的getnumber怎么用_java安全编码指南之:Number操作详解
简介 java中可以被称为Number的有byte,short,int,long,float,double和char,我们在使用这些Nubmer的过程中,需要注意些什么内容呢?一起来看看吧. Numb ...
- java 找出重复的数据_java 查找list中重复数据实例详解
java 查找list中重复数据实例详解 需求: 查找一个list集合中所有重复的数据,重复的数据可能不止一堆,比如:aa, bb, aa, bb, cc , dd, aa这样的数据.如果有重复数据, ...
- java构造单例线程池_java中常见的六种线程池详解
之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池 首先我们列出Java 中的六种线程池如 ...
- java中的23种设计模式_Java开发中的23种设计模式详解
所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在.就像是Java Web中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等. [J ...
- java中for的常规用法_Java for循环的几种用法详解
本文非常适合初学Java的程序员,主要是来了解一下Java中的几种for循环用法,分析得十分详细,一起来看看. J2SE 1.5提供了另一种形式的for循环.借助这种形式的for循环,可以用更简单地方 ...
- java上传csv错误信息_java处理csv文件上传示例详解
前言:示例只是做了一个最最基础的上传csv的示例,如果要引用到代码中去,还需要根据自己的业务自行添加一些逻辑处理. ReadCsvUtil工具类 package com.hanfengyeqiao.g ...
- java类的定义的实例_Java中类的定义和初始化示例详解
类的定义 类的定义格式 //创建类 class classname{ field ://成员属性/字段 method://方法 } class为定义类的关键字,classname为类的名字,{ }为类 ...
- java中byte装箱和装箱_Java包装类、拆箱和装箱详解
虽然 Java 语言是典型的面向对象编程语言,但其中的八种基本数据类型并不支持面向对象编程,基本类型的数据不具备"对象"的特性--不携带属性.没有方法可调用. 沿用它们只是为了迎合 ...
最新文章
- java常见的异常类型_Java几种常见的异常类型
- Redis的数据类型详解
- 构成子网与构成超网的分析
- 2017-2018-1 20155320第十周课下作业-IPC
- C#与Unity 数据存储
- mysql 停止同步_MYSQL从库数据冲突导致同步停止
- 收集灵感必备|文字这样组合排版那才叫设计
- html5个人简历代码模板,个人简历HTML模板
- red hat linux没有库文件libiconv.so,libiconv库链接问题一则(备忘)
- 【重磅干货整理】机器学习(Machine Learning)与深度学习(Deep Learning)资料汇总
- SAP Query创建教程
- PowerDesign介绍与使用
- 如何修改web浏览器title文字及icon
- 服务器与Tomcat区别
- 零基础编程入门先学什么
- 写 git commit message 的错误姿势 —— whatthecommit.com 到底说了些什么
- ORAN架构和功能划分
- GNSS 常用缩略语汇总
- HTML/CSS-动画
- APIDOC使用教程
热门文章
- 文献记录(part17)--VARCLUST: clustering variables using dimensionality reduction
- CSS基础(part13)--浮动
- 网工小课堂(part1)--计算机网络概论
- 利用python爬虫(part16)--json解析模块
- 《娱乐至死》读书笔记(part5)--那些想当上帝的人把自己塑造成观众期望的形象
- python中socket实现代理功能_python实现代理服务功能实例
- Python之父推荐!《Python 3网络爬虫开发实战》第二版!文末送签名版!
- SAP 电商云 UI 持续集成里 docker 的使用场景一例
- SAP CRM SPRO Customizing 里 Text Object 属性 continue 的含义
- ng-content的一个实际例子