相信项目中作一些htttp接口,避免不了要对参数进行校验,大多数状况下,其实咱们只是校验是否为NULL就能够了java
默认的版本是6.0.9.Final 使用过程当中NotBlank会显示红色,因此这里讲版本下降,这样就不会显示红色了git
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <exclusions> <exclusion> <artifactId>validation-api</artifactId> <groupId>javax.validation</groupId> </exclusion> </exclusions> <!--默认的版本是6.0.9.Final 使用过程当中NotBlank会显示红色, 因此这里讲版本下降,这样就不会显示红色了--> <version>4.3.2.Final</version> </dependency> <dependency> <artifactId>validation-api</artifactId> <groupId>javax.validation</groupId> </dependency>
一、若是变量传入的时候是NULL,则不会校验 相似于 @AssertTrue @Size(min=, max=) 等github
二、为了咱们之后方便, 全部校验属性必须加组,方便阅读web
空检查 @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<X<1000") 验证 String 对象是否符合正则表达式的规则 数值检查,建议使用在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=) 被注释的元素必须在合适的范围内
@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; } }
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 * 注意点 * 一、 下面出了判断空的注解以外,必须有值才回校验 * 二、 全部校验属性必须加组,方便阅读 * @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<String> 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 ; }
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; }
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 ; }
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<ConstraintViolation<Object>> 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<ConstraintViolation<Object>> validate = validator.validate(object, group); return resultValidate(validate); } } private static String resultValidate(Set<ConstraintViolation<Object>> 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"; } }
package com.hlj.vialidate; /** * @author HealerJean * @version 1.0v * @Description * @ClassName CoreValidateGroup * @date 2019/4/17 9:30. */ public class ValidateGroup { public interface HealerJean {}; }
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); } }
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" }, }
能够用于字典校验正则表达式
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 { }; }
package com.hlj.vialidate.inter; import org.apache.commons.lang3.StringUtils; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; /** * 校验数据 */ public class NameIncludeValidator implements ConstraintValidator<NameInclude, String> { 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 ; } } }
/** * 自定义注解校验 */ @NameInclude(message = "类型必须是type value必须是HealerJean" ,type = "Mail",groups = {ValidateGroup.HealerJean.class}) @NotNull(message = "自定义校验不能为空",groups = {ValidateGroup.HealerJean.class}) private String myName ;
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" }
哈,博主很乐意和各路好友交流,若是满意,请打赏博主任意金额,感兴趣的在微信转帐的时候,备注您的微信或者其余联系方式。添加博主微信哦。spring
请下方留言吧。可与博主自由讨论哦apache
微信 | 微信公众号 | 支付宝 |
---|---|---|
![]() |
![]() |
![]() |