java validate校验_自定义工具类实现validate参数校验
前言
相信项目中做一些htttp接口,避免不了要对参数进行校验,大多数情况下,其实我们只是校验是否为NULL就可以了
1、通过注解实现各种状态的字段
1.1、引入依赖
默认的版本是6.0.9.Final 使用过程中NotBlank会显示红色,所以这里讲版本降低,这样就不会显示红色了
org.hibernate
hibernate-validator
validation-api
javax.validation
4.3.2.Final
validation-api
javax.validation
1.2、注解
1、如果变量传入的时候是NULL,则不会校验 类似于 @AssertTrue @Size(min=, max=) 等
2、为了我们以后方便, 所有校验属性必须加组,方便阅读
空检查
@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
Hibernate
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
Booelan检查
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false
长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=) 验证字符串的长度
日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern(regexp="[1-9]{1,3}", message="数量X: 必须为正整数,并且0
数值检查,建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null
@Min 验证 Number 和 String 对象是否大等于指定的值
@Max 验证 Number 和 String 对象是否小等于指定的值
@DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
Hibernate
@Range(min=10000,max=50000,message="range.bean.wage")
@Valid 对象传递参数的时候用到
public String doAdd(Model model, @Valid AnimalForm form, BindingResult result){}
其中 Hibernate Validator 附加的 constraint (也就是说如果下面的内容中,不引入hibernate包就不会起作用)
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。
@Length(min=, max=) 验证字符串的长度
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
1.3、config
@Configuration
public class ValidatorConfiguration {
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
MethodValidationPostProcessor processor = new MethodValidationPostProcessor();
processor.setValidator(validator());
return processor;
}
@Bean
public static Validator validator() {
return ValidateUtils.validator;
}
}
1.3、DTO类
1.3.1、被校验对象 JavaBean
package com.hlj.vialidate.data;
import com.hlj.vialidate.ValidateGroup;
import com.hlj.vialidate.inter.NameInclude;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
import javax.validation.Valid;
import javax.validation.constraints.*;
import java.util.List;
/**
* @author HealerJean
* @version 1.0v
* @Description
* 注意点
* 1、 下面出了判断空的注解之外,必须有值才回校验
* 2、 所有校验属性必须加组,方便阅读
* @ClassName JavaBean
* @date 2019/4/17 14:08.
*/
@Data
public class JavaBean extends BaseBean{
@NotBlank(message = "name 为空 ",groups = ValidateGroup.HealerJean.class)
@Size(min = 1,max = 5,message = "name @Size(min = 1,max = 5 字符串长度 最低为1 最大为5",groups = ValidateGroup.HealerJean.class)
private String name ;
@Size(min = 1,max = 2, message = "list @Size(min = 1,max = 2 集合大小 最低为1 最大为2",groups = ValidateGroup.HealerJean.class)
private List list;
@Length(min = 1,max = 5,message = "@Length(min = 1,max = 5 字符串长度 最低为1 最大为5",groups = ValidateGroup.HealerJean.class)
private String strLength;
@Min(value = 5, message = "strNum @Min(value = 5,message = 字符串(数字的字符串大小判断)【数字类型的变量都可以】",groups = ValidateGroup.HealerJean.class)
private String strNum ;
@Range(min = 1,max = 10 ,message = "strRange @Range(min = 1,max = 10 最小为1,最大为10 ",groups = ValidateGroup.HealerJean.class)
private String strRange ;
@DecimalMin(value = "100.1",message = "小数值的判断,最小为 100.1",groups = ValidateGroup.HealerJean.class)
private String strDecimal ;
@Digits(integer = 2,fraction = 2,message = "strDigts @Digits(integer = 2,fraction = 2 整数最高2位,小数最高2位",groups = ValidateGroup.HealerJean.class)
private String strDigts;
@AssertFalse(message = " @AssertFalse 必须为false " ,groups = ValidateGroup.HealerJean.class)
private Boolean assertFalse ;
/**
* 内部对象校验
*/
@Valid
@NotNull(message = "内部对象不能为空" ,groups = ValidateGroup.HealerJean.class)
private InnerBean innerBean ;
/**
* 自定义注解校验
*/
@NameInclude(message = "类型必须是type value必须是HealerJean" ,type = "Mail",groups = {ValidateGroup.HealerJean.class})
private String myName ;
}
1.3.2、父类
package com.hlj.vialidate.data;
import com.hlj.vialidate.ValidateGroup;
import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;
/**
* @author HealerJean
* @version 1.0v
* @ClassName BaseBean
* @date 2019/6/11 16:38.
* @Description
*/
@Data
public class BaseBean {
@NotBlank(message = "父类String 不能为空",groups = ValidateGroup.HealerJean.class)
private String fatherString;
}
1.3.3、内部使用使用类
package com.hlj.vialidate.data;
import com.hlj.vialidate.ValidateGroup;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
/**
* @author HealerJean
* @version 1.0v
* @ClassName InnerBean
* @date 2019/6/11 16:39.
* @Description
*/
@Data
public class InnerBean {
@NotBlank(message = "innerBean不能为空",groups = ValidateGroup.HealerJean.class)
@Length(max = 2,message = "innerNname 长度最长为2",groups = ValidateGroup.HealerJean.class)
private String innerNname ;
}
1.4、校验工具类
package com.hlj.utils;
import com.hlj.data.general.AppException;
import org.hibernate.validator.HibernateValidator;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;
/**
* @Description 校验工具
*/
public class ValidateUtils {
public static Validator validator;
static {
validator = Validation
.byProvider(HibernateValidator.class)
.configure()
//快速返回模式,有一个验证失败立即返回错误信息
.failFast(true)
.buildValidatorFactory()
.getValidator();
}
/**
* 静态方法校验使用的
*
* @param object
* @return
*/
public static String validate(Object object) {
if(object == null){
throw new AppException("参数不完整");
}
Set> validate = validator.validate(object);
return resultValidate(validate);
}
/**
* 静态方法校验使用,并且带分组的
*
* @param object
* @param group
* @return
*/
public static String validate(Object object, Class group) {
if (group == null) {
return validate(object);
} else {
Set> validate = validator.validate(object, group);
return resultValidate(validate);
}
}
private static String resultValidate(Set> validate) {
if (!validate.isEmpty()) {
final StringBuffer stringBuffer = new StringBuffer();
validate.stream().forEach(
item -> stringBuffer.append(item.getMessage()).append(","));
stringBuffer.setLength(stringBuffer.length() - 1);
return stringBuffer.toString();
}
return "success";
}
}
1.5、组
package com.hlj.vialidate;
/**
* @author HealerJean
* @version 1.0v
* @Description
* @ClassName CoreValidateGroup
* @date 2019/4/17 9:30.
*/
public class ValidateGroup {
public interface HealerJean {};
}
1.6 、测试
1.6.1、Controller
package com.hlj.moudle.validate;
import com.hlj.data.general.ResponseBean;
import com.hlj.utils.ValidateUtils;
import com.hlj.vialidate.data.JavaBean;
import com.hlj.vialidate.ValidateGroup;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
/**
* @Description
* @Author HealerJean
* @Date 2018/3/22 上午10:22.
*/
@ApiResponses(value = {
@ApiResponse(code = 200, message = "访问正常"),
@ApiResponse(code = 301, message = "逻辑错误"),
@ApiResponse(code = 500, message = "系统错误"),
@ApiResponse(code = 401, message = "未认证"),
@ApiResponse(code = 403, message = "禁止访问"),
@ApiResponse(code = 404, message = "url错误")
})
@Api(description = "demo控制器")
@Controller
@RequestMapping("hlj")
@Slf4j
public class VialidateController {
@ApiOperation(value = "Post接口",
notes = "Post接口",
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE,
response = ResponseBean.class
)
@PostMapping( value = "validate",produces="application/json;charset=utf-8")
@ResponseBody
public ResponseBean post(@RequestBody JavaBean JavaBean){
String validate = ValidateUtils.validate(JavaBean,ValidateGroup.HealerJean.class);
if(!"success".equals(validate)){
log.info("错误信息:{}", validate);
}
return ResponseBean.buildSuccess(validate);
}
}
1.6.2、测试样例
POST http://localhost:8888/hlj/validate
Content-Type: application/json; charset=UTF-8
{
"name":"1234",
"strLength":"12345",
"list": ["list","list2"],
"strNum":"6",
"strRange":"9",
"strDecimal":"100.2",
"strDigts":"15.66",
"fatherString":"fatherString",
"innerBean":{
"innerNname":"in"
},
}
2、自定注解实现
可以用于字典校验
4.1、自定义注解
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* 自定义注解
*/
@Constraint(validatedBy = {NameIncludeValidator.class})
@Documented
@Target( { ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface NameInclude {
String message() ; //报错返回的信息
Class>[] groups() default { }; //被哪个组校验
String type() ; //自己定义的
Class extends Payload>[] payload() default { };
}
4.2、自定义注解验证数据
package com.hlj.vialidate.inter;
import org.apache.commons.lang3.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* 校验数据
*/
public class NameIncludeValidator implements ConstraintValidator {
private String type;
/**
* 获取注解中的值
* @param constraintAnnotation
*/
@Override
public void initialize(NameInclude constraintAnnotation) {
type = constraintAnnotation.type();
}
/**
* @param value 字段数据
* @param context
* @return
*/
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if(StringUtils.isBlank(value)){
return true;
}
if("Mail".equals(type)&&"HealerJean".equals(value)){
return true ;
}else {
return false ;
}
}
}
4.3、对象中自定义注解的使用
/**
* 自定义注解校验
*/
@NameInclude(message = "类型必须是type value必须是HealerJean" ,type = "Mail",groups = {ValidateGroup.HealerJean.class})
@NotNull(message = "自定义校验不能为空",groups = {ValidateGroup.HealerJean.class})
private String myName ;
4.4、测试
POST http://localhost:8888/hlj/validate
Content-Type: application/json; charset=UTF-8
{
"name":"1234",
"strLength":"12345",
"list": ["list","list2"],
"strNum":"6",
"strRange":"9",
"strDecimal":"100.2",
"strDigts":"15.66",
"fatherString":"fatherString",
"innerBean":{
"innerNname":"in"
},
"myName":"HealerJean"
}
感兴趣的,欢迎添加博主微信
哈,博主很乐意和各路好友交流,如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,备注您的微信或者其他联系方式。添加博主微信哦。
请下方留言吧。可与博主自由讨论哦
微信
微信公众号
支付宝
java validate校验_自定义工具类实现validate参数校验相关推荐
- java listutils_Java的list自定义工具类ListUtils
/** * 将list中map的key为ID的值作为KEY在套一层 */ public static Map> keyToID( List> datalist) { Map> res ...
- java 文件下载方法_【工具类】Java后台上传下载文件的几种方式
/** * 将本地照片上传至腾讯云服务上 */ public void uploadImage(String localImagePath) throws Exception { // 1.将订单照片 ...
- 【开发随机】JAVA+POI+自定义注解+反射构建自定义工具类实现快捷简便的Excel模板化导出(附demo代码)
220907更新 项目UAT期间,用户反映了一个问题,数据量稍大的情况下,会出现"从某一行开始,往下所有行设置的字体和字体大小不生效"的BUG. 经过排查,发现原因是:POI的XS ...
- 第三次学JAVA再学不好就吃翔(part27)--自定义工具类
学习笔记,仅供参考 面向对象 自定义工具类中使用静态方法 有的时候,我们需要创建一个自己的工具类,方便工作和学习中使用. 在工具类中,我们要在里面放一些静态的方法,方便我们用类名调用,这时,为了防止有 ...
- java inputtools_Java后台开发常用工具类
本文涉及的工具类部分是自己编写,另一部分是在项目里收集的.工具类涉及数据库连接.格式转换.文件操作.发送邮件等等.提高开发效率,欢迎收藏与转载. 数据库连接工具类 数据库连接工具类--仅仅获得连接对象 ...
- Java各种方式加解密工具类
文章目录 前言 1.AES 2.DES 3.BCrypt 4.Http Basic 5.MD5 6.RSA 7.SHA256 8.SM3 9.SM4 前言 JAVA能够实现各种加解密方式,这里对各种加 ...
- 自定义工具类:工具类介绍
自定义工具类 自定义注解 自定义注解 package com.learn.domain.poi;import java.lang.annotation.ElementType; import java ...
- java 兼容excel_Java解析Excel工具类(兼容xls和xlsx)
依赖jar org.apache.poi poi-ooxml 4.0.1 ExcelUtils.java package javax.utils; import java.io.File; impor ...
- 【java笔记】Collections集合工具类
java.utils.Collections是集合工具类,用来对集合进行操作 常用方法: public static<T>boolean addAll(Collection<T> ...
最新文章
- Color Blended Layers
- mingw编译ffmpeg 错误:Unknown option --enable-memalign-hack
- python idf_python计算idf
- hadoop之 YARN配置参数剖析—RM与NM相关参数
- 火狐、IE、Chrome已进入三国时代
- hive实现根据用户分组,按用户记录求上下两条记录的时间差
- Oracle数据库导入csv文件(sqlldr命令行)
- [Python] - 批处理git conflict文件
- c语言字符数组赋值_C语言关于结构体字符成员元素赋值的方法
- cad经典工作空间_最实用的CAD界面的设置
- Android网易歌词json接口,网易云音乐API接口-music
- 心心念念的安卓简单和多功能计算器来了
- 破解版editPlus
- 并发编程、并行、多线程、锁、同步、异步、多线程、单线程、阻塞io、非阻塞io
- 09向量的混合积、向量之间的位置关系、用坐标行列式计算混合积、三向量共面的条件
- AndroidFTP客户端-FTP管家源码
- 服务器修改密码次数过多提示被锁定,路由器密码错误次数过多锁死了怎么办?...
- 关于三方协议不得不说的注意事项
- 怎么防止过曝_在拍摄的时候,要如何避免闪光灯过曝?
- openwrt开启网络共享Samba
热门文章
- Ora-19804: Cannot reclaim 45561856 bytes disk space from 8589934592 limit
- C++基础算法学习——熄灯问题
- Backbone学习日记第二集——Model
- 更新IIS下WCF服务产生的两则问题
- WF4.0 Beta1 CancellationScope 取消容器
- windows--reg--向注册表中写入一些数据
- C++ 的 allocator类 提供类型化的内存分配以及对象的分配和撤销
- AndroidStudio安卓原生开发_UI控件_TextView_Button_EditText---Android原生开发工作笔记97
- AndroidStudio_你的主机中的软件中止了一个已建立的连接---Android原生开发工作笔记123
- ES6-ES11新特性_ECMAScript_简单介绍---JavaScript_ECMAScript工作笔记001