一家专门做灯的网站,seo网站推广培训,淘宝指数查询官网手机版,wordpress栏目导航https://www.cnblogs.com/charlypage/p/9385146.html 第5章—构建Spring Web应用程序—关于spring中的validate注解后台校验的解析
关于spring中的validate注解后台校验的解析
在后台开发过程中#xff0c;对参数的校验成为开发环境不可缺少的一个环节。比如参数不能为null对参数的校验成为开发环境不可缺少的一个环节。比如参数不能为nullemail那么必须符合email的格式如果手动进行if判断或者写正则表达式判断无意开发效率太慢在时间、成本、质量的博弈中必然会落后。所以把校验层抽象出来是必然的结果下面说下几种解决方案。
1.简单的校验Demo
依赖: Copy
dependency groupIdjavax.validation/groupId artifactIdvalidation-api/artifactId version1.1.0.Final/version /dependency
Student: Copy
import javax.validation.constraints.*; import java.math.BigDecimal; import java.util.Date; public class Student { 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 : false; } Future(message 生日必须在当前实践之前) private Date birthday; Pattern(regexp ^(.)(.)$, message 邮箱的格式不合法) private String email; public String getName() { return name; } public void setName(String name) { this.name name; } public String getAddress() { return address; } public void setAddress(String address) { this.address address; } public BigDecimal getWeight() { return weight; } public void setWeight(BigDecimal weight) { this.weight weight; } public String getFriendName() { return friendName; } public void setFriendName(String friendName) { this.friendName friendName; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday birthday; } public String getEmail() { return email; } public void setEmail(String email) { this.email email; } }
DemoTest: Copy
import javax.validation.*; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Set; public class DemoTest { public static void main(String[] args) { Student xiaoming getBean(); ListString 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 T ListString validate(T t) { Validator validator factory.getValidator(); SetConstraintViolationT constraintViolations validator.validate(t); ListString messageList new ArrayList(); for (ConstraintViolationT constraintViolation : constraintViolations) { messageList.add(constraintViolation.getMessage()); } return messageList; } }
2.SpringMVC中的应用:
实体类的注解还是和Student类一样,只是controller接值的时候需要做点改动如下: Copy
// 使用Valid 表明获取到的数据模型需要验证传入的Errors对象就是验证出错之后的数据对象包括校验错误的个数具体的信息等 RequestMapping(value/register, methodRequestMethod.POST) public String registerForm( Valid ModelAttribute Student stu, Errors error){ logger.info(注册新用户); if ( error.hasErrors()) { logger.error(出错啦); } stuList.add(stu); logger.info(注册的用户信息/n stu); return login; } Valid注解的使用---SpringMvc中的校验框架valid和validation的概念及相关使用
转载dayformyjob 最后发布于2018-08-22 23:13:44 阅读数 11815 收藏
展开
转载自 https://blog.csdn.net/xzmeasy/article/details/76098188 https://www.cnblogs.com/myinspire/articles/7649027.html
Valid注解用于校验所属包为javax.validation.Valid。
① 首先需要在实体类的相应字段上添加用于充当校验条件的注解如Min,如下代码age属于Girl类中的属性 Min(value 18,message 未成年禁止入内)private Integer age;
② 其次在controller层的方法的要校验的参数上添加Valid注解并且需要传入BindingResult对象用于获取校验失败情况下的反馈信息如下代码
PostMapping(/girls)public Girl addGirl(Valid Girl girl, BindingResult bindingResult) {if(bindingResult.hasErrors()){System.out.println(bindingResult.getFieldError().getDefaultMessage());return null;}return girlResposity.save(girl);}
bindingResult.getFieldError.getDefaultMessage()用于获取相应字段上添加的message中的内容如Min注解中message属性的内容
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.比较
Valid是使用hibernate validation的时候使用
Validated 是只用spring Validator 校验机制使用\ 2.实现
其中validjava的jsr303声明了这类接口hibernate-validator对其进行了实现 3.依赖
在使用maven框架整合时需要引入的依赖部分如下 span dependency groupIdjavax.validation/groupId artifactIdvalidation-api/artifactId version1.1.0.Final/version /dependency dependency groupIdorg.hibernate/groupId artifactIdhibernate-validator/artifactId version5.2.1.Final/version /dependency
/span 4.JSR303定义的校验类型 空检查Null 验证对象是否为nullNotNull 验证对象是否不为null, 无法查检长度为0的字符串NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.NotEmpty 检查约束元素是否为NULL或者是EMPTY.Booelan检查AssertTrue 验证 Boolean 对象是否为 true AssertFalse 验证 Boolean 对象是否为 false 长度检查Size(min, max) 验证对象Array,Collection,Map,String长度是否在给定的范围之内 Length(min, max) Validates that the annotated string is between min and max included.日期检查Past 验证 Date 和 Calendar 对象是否在当前时间之前 Future 验证 Date 和 Calendar 对象是否在当前时间之后 Pattern 验证 String 对象是否符合正则表达式的规则数值检查建议使用在Stirng,Integer类型不建议使用在int类型上因为表单值为“”时无法转换为int但可以转换为Stirng为,Integer为nullMin 验证 Number 和 String 对象是否大等于指定的值 Max 验证 Number 和 String 对象是否小等于指定的值 DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度Digits 验证 Number 和 String 的构成是否合法 Digits(integer,fraction) 验证字符串是否是符合指定格式的数字interger指定整数精度fraction指定小数精度。Range(min, max) Checks whether the annotated value lies between (inclusive) the specified minimum and maximum.Range(min10000,max50000,messagerange.bean.wage)
private BigDecimal wage;Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)CreditCardNumber信用卡验证Email 验证是否是邮件地址如果为null,不进行验证算通过验证。ScriptAssert(lang ,script, alias)URL(protocol,host, port,regexp, flags) 5.使用
新建一个类 /** * * Title: AppConfigList.java * Package com.bonree.browser.model * Description: 白名单Url匹配规则类 * author phycho * date 2017/6/26 下午4:45:30 * version V1.0 */
public class AppConfigList extends PageAppConfigList {
private Integer id;//Id
NotNull(message appId不能为空, groups {AccountGroup.Update.class}) private Integer appId;// 应用id
NotEmpty(message 规则不能为空, groups {AppConfigGroup.Add.class,AppConfigGroup.Update.class}) Size(max 200,groups {AppConfigGroup.Add.class,AppConfigGroup.Update.class}) private String url;// url规则
NotNull(message typec不能为空, groups {AccountGroup.Update.class}) private Byte typec 1;// 类型
private Date createTime;// 创建时间
private Date modifTime;// 更新时间
NotNull(message 状态参数不能为空, groups {AppConfigGroup.Update.class}) private Byte status 1;// 状态
private Double orders;// 字段顺序
/** * 生成get、set方法 * * return */
public String getUrl() { return url; }
public Integer getId() { return id; }
public void setId(Integer id) { this.id id; }
public Integer getAppId() { return appId; }
public void setAppId(Integer appId) { this.appId appId; }
public Byte getTypec() { return typec; }
public void setTypec(Byte typec) { this.typec typec; }
public Date getCreateTime() { return createTime; }
public void setCreateTime(Date createTime) { this.createTime createTime; }
public Date getModifTime() { return modifTime; }
public void setModifTime(Date modifTime) { this.modifTime modifTime; }
public Byte getStatus() { return status; }
public void setStatus(Byte status) { this.status status; }
public Double getOrders() { return orders; }
public void setOrders(Double orders) { this.orders orders; }
public void setUrl(String url) { this.url url; }
} 校验逻辑 /*** param result 绑定结果* param model 数据模型* return 是否发生错误 true发生错误false:未发生错误* Description: 后台校验*/public static boolean validate(BindingResult result, Model model) {boolean validateResult false;if (result.hasErrors()) {validateResult true;if (model ! null) {FieldError error result.getFieldErrors().get(0);// 为了避免大量的校验在前端堆积,影响用户体验只返回一个错误提示log.debug(validate error: error.getDefaultMessage());model.addAttribute(msg, error.getDefaultMessage());}}return validateResult;} Controller中的使用 // 添加白名单规则RequestMapping(value /page/add, method RequestMethod.POST)ResponseBodypublic ResultData addUrlRule(Validated(AppConfigGroup.Add.class) AppConfigList appConfigList, BindingResult result, Model model) {// 后台校验if (ValidateHandler.validate(result, model)) {return null;}appConfigList.setStatus((byte) 1);appConfigList.setCreateTime(new Date());appConfigList.setModifTime(new Date());Double orders appConfigService.selectOrdersByAppId(appConfigList.getAppId());if (orders null) {appConfigList.setOrders((double) 1000);} else {appConfigList.setOrders(orders 1000);}return getResult(appConfigService.insert(appConfigList));} 6.补充 Apr 8, 2014 2:13:57 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet springmvc threw exception
javax.validation.UnexpectedTypeException: No validator could be found for type: java.lang.Integer at org.hibernate.validator.engine.ConstraintTree.verifyResolveWasUnique(ConstraintTree.java:383) at org.hibernate.validator.engine.ConstraintTree.findMatchingValidatorClass(ConstraintTree.java:364) at org.hibernate.validator.engine.ConstraintTree.getInitializedValidator(ConstraintTree.java:313) at org.hibernate.validator.engine.ConstraintTree.validateConstraints(ConstraintTree.java:144) at org.hibernate.validator.engine.ConstraintTree.validateComposingConstraints(ConstraintTree.java:233) at org.hibernate.validator.engine.ConstraintTree.validateConstraints(ConstraintTree.java:128) at org.hibernate.validator.engine.ConstraintTree.validateConstraints(ConstraintTree.java:117) at org.hibernate.validator.metadata.MetaConstraint.validateConstraint(MetaConstraint.java:84) at org.hibernate.validator.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:452) 在使用hibernate validator出现上图中错误的时候要注意 NotNull 和 NotEmpty 和NotBlank 区别 NotEmpty 用在集合类上面 NotBlank 用在String上面 NotNull 用在基本类型上 如果在基本类型上面用NotEmpty或者NotBlank 会出现上面的错