一、前言

在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节。比如参数不能为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 后台参数验证的使用详解相关推荐

  1. java break 在if 中使用_java中使用国密SM4算法详解

    前言 上次总结了一下加密算法的分类(加密算法有集中形式,各有什么不同?),现在我们用java语言实现一下SM4:无线局域网标准的分组数据算法.对称加密,密钥长度和分组长度均为128位. ps:我们既可 ...

  2. java中的getnumber怎么用_java安全编码指南之:Number操作详解

    简介 java中可以被称为Number的有byte,short,int,long,float,double和char,我们在使用这些Nubmer的过程中,需要注意些什么内容呢?一起来看看吧. Numb ...

  3. java 找出重复的数据_java 查找list中重复数据实例详解

    java 查找list中重复数据实例详解 需求: 查找一个list集合中所有重复的数据,重复的数据可能不止一堆,比如:aa, bb, aa, bb, cc , dd, aa这样的数据.如果有重复数据, ...

  4. java构造单例线程池_java中常见的六种线程池详解

    之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池 首先我们列出Java 中的六种线程池如 ...

  5. java中的23种设计模式_Java开发中的23种设计模式详解

    所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在.就像是Java Web中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等. [J ...

  6. java中for的常规用法_Java for循环的几种用法详解

    本文非常适合初学Java的程序员,主要是来了解一下Java中的几种for循环用法,分析得十分详细,一起来看看. J2SE 1.5提供了另一种形式的for循环.借助这种形式的for循环,可以用更简单地方 ...

  7. java上传csv错误信息_java处理csv文件上传示例详解

    前言:示例只是做了一个最最基础的上传csv的示例,如果要引用到代码中去,还需要根据自己的业务自行添加一些逻辑处理. ReadCsvUtil工具类 package com.hanfengyeqiao.g ...

  8. java类的定义的实例_Java中类的定义和初始化示例详解

    类的定义 类的定义格式 //创建类 class classname{ field ://成员属性/字段 method://方法 } class为定义类的关键字,classname为类的名字,{ }为类 ...

  9. java中byte装箱和装箱_Java包装类、拆箱和装箱详解

    虽然 Java 语言是典型的面向对象编程语言,但其中的八种基本数据类型并不支持面向对象编程,基本类型的数据不具备"对象"的特性--不携带属性.没有方法可调用. 沿用它们只是为了迎合 ...

最新文章

  1. java常见的异常类型_Java几种常见的异常类型
  2. Redis的数据类型详解
  3. 构成子网与构成超网的分析
  4. 2017-2018-1 20155320第十周课下作业-IPC
  5. C#与Unity 数据存储
  6. mysql 停止同步_MYSQL从库数据冲突导致同步停止
  7. 收集灵感必备|文字这样组合排版那才叫设计
  8. html5个人简历代码模板,个人简历HTML模板
  9. red hat linux没有库文件libiconv.so,libiconv库链接问题一则(备忘)
  10. 【重磅干货整理】机器学习(Machine Learning)与深度学习(Deep Learning)资料汇总
  11. SAP Query创建教程
  12. PowerDesign介绍与使用
  13. 如何修改web浏览器title文字及icon
  14. 服务器与Tomcat区别
  15. 零基础编程入门先学什么
  16. 写 git commit message 的错误姿势 —— whatthecommit.com 到底说了些什么
  17. ORAN架构和功能划分
  18. GNSS 常用缩略语汇总
  19. HTML/CSS-动画
  20. APIDOC使用教程

热门文章

  1. 文献记录(part17)--VARCLUST: clustering variables using dimensionality reduction
  2. CSS基础(part13)--浮动
  3. 网工小课堂(part1)--计算机网络概论
  4. 利用python爬虫(part16)--json解析模块
  5. 《娱乐至死》读书笔记(part5)--那些想当上帝的人把自己塑造成观众期望的形象
  6. python中socket实现代理功能_python实现代理服务功能实例
  7. Python之父推荐!《Python 3网络爬虫开发实战》第二版!文末送签名版!
  8. SAP 电商云 UI 持续集成里 docker 的使用场景一例
  9. SAP CRM SPRO Customizing 里 Text Object 属性 continue 的含义
  10. ng-content的一个实际例子