zoukankan      html  css  js  c++  java
  • 转:使用JSR-303进行校验 @Valid

    一、在SringMVC中使用

    使用注解

    1、准备校验时使用的JAR

    validation-api-1.0.0.GA.jar:JDK的接口;

    hibernate-validator-4.2.0.Final.jar是对上述接口的实现;

    log4j、slf4j、slf4j-log4j

    2、编写需要校验的bean

    @NotNull(message="名字不能为空")
    private String userName;
    @Max(value=120,message="年龄最大不能查过120")
    private int age;
    @Email(message="邮箱格式错误")
    private String email;

    3、校验方法

    复制代码
    @RequestMapping("/login")
        public String testValid(@Valid User user, BindingResult result){
            if (result.hasErrors()){
                List<ObjectError> errorList = result.getAllErrors();
                for(ObjectError error : errorList){
                    System.out.println(error.getDefaultMessage());
                }
            }
               
            return "test";
        }
    复制代码

    备注:这里一个@Valid的参数后必须紧挨着一个BindingResult 参数,否则spring会在校验不通过时直接抛出异常

    前台可以使用spring的标签库也可以自己自定义处理

    spring标签库的用法:

    复制代码
    <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>   
      
    <html>   
    <head>   
    <title>Reservation Form</title>   
    <style>   
    .error {   
        color: #ff0000;   
        font-weight: bold;   
    }   
    </style>   
    </head>   
      
    <body>   
        <form:form method="post" modelAttribute="vm">   
            <form:errors path="*" cssClass="error" />   
            <table>   
                <tr>   
                    <td>Name</td>   
                    <td><form:input path="userName" />   
                    </td>   
                    <td><form:errors path="userName" cssClass="error" />   
                    </td>   
                </tr>   
                <tr>   
                    <td>email</td>   
                    <td><form:input path="email" />   
                    </td>   
                    <td><form:errors path="email" cssClass="error" />   
                    </td>   
                </tr>   
           
                <tr>   
                    <td colspan="3"><input type="submit" />   
                    </td>   
                </tr>   
            </table>   
        </form:form>   
    </body>   
    </html> 
    复制代码

    4、开启spring的Valid功能

    <mvc:annotation-driven />

    5、自定义校验类型

    可以参考:http://exceptioneye.iteye.com/blog/1305040

    使用接口

    可以参考:http://elf8848.iteye.com/blog/1299587

    二、硬编码的实现方式

    手动校验实现方式:

    复制代码
     1 import java.util.Iterator;
     2 import java.util.Set;
     3 
     4 import javax.validation.ConstraintViolation;
     5 import javax.validation.Validation;
     6 
     7 import org.apache.commons.lang3.StringUtils;
     8 
     9 /**
    10  * JSR303的校验帮助类
    11  * @author yangzhilong
    12  *
    13  */
    14 public class Jsr303Util {
    15 
    16     /**
    17      * 如果返回null则表示没有错误
    18      * @param obj
    19      * @return
    20      */
    21     public static String check(Object obj) {
    22         if (null == obj) {
    23             return "入参vo不能为空";
    24         }
    25         Set<ConstraintViolation<Object>> validResult = Validation.buildDefaultValidatorFactory().getValidator().validate(obj);
    26         if (null != validResult && validResult.size() > 0) {
    27             StringBuilder sb = new StringBuilder();
    28             for (Iterator<ConstraintViolation<Object>> iterator = validResult.iterator(); iterator.hasNext();) {
    29                 ConstraintViolation<Object> constraintViolation = (ConstraintViolation<Object>) iterator.next();
    30                 if(StringUtils.isNotBlank(constraintViolation.getMessage())) {
    31                     sb.append(constraintViolation.getMessage()).append("、");
    32                 } else {
    33                     sb.append(constraintViolation.getPropertyPath().toString()).append("不合法、");
    34                 }
    35             }
    36             if (sb.lastIndexOf("、") == sb.length() - 1) {
    37                 sb.delete(sb.length() - 1, sb.length());
    38             }
    39             return sb.toString();
    40         }
    41         return null;
    42     }
    43 
    44 }
    复制代码

     三、JSR303定义的校验类型

    复制代码

    空检查

    @Null       验证对象是否为null

    @NotNull    验证对象是否不为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为null

    @Min            验证 Number 和 String 对象是否大等于指定的值  

    @Max            验证 Number 和 String 对象是否小等于指定的值  

    @DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度

    @DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度

    @Digits     验证 Number 和 String 的构成是否合法  

    @Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。

    @Range(min=, max=) 检查数字是否介于min和max之间.

    @Range(min=10000,max=50000,message="range.bean.wage")
    private BigDecimal wage;

    @Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)

    @CreditCardNumber信用卡验证

    @Email  验证是否是邮件地址,如果为null,不进行验证,算通过验证。

    @ScriptAssert(lang= ,script=, alias=)

    @URL(protocol=,host=, port=,regexp=, flags=)

    复制代码
  • 相关阅读:
    【Nginx】ngx_event_core_module模块
    ELMAH--Using HTTP Modules and Handlers to Create Pluggable ASP.NET Components 77 out of 90 rated th
    nyist oj 214 单调递增子序列(二) (动态规划经典)
    java 入门书籍(java7)
    ARCGIS将WGS84坐标投影到高斯平面
    【linux】linux下对java程序生成dump文件,并使用IBM Heap Analyzer进行分析,查找定位内存泄漏的问题代码
    【springboot】【socket】spring boot整合socket,实现服务器端两种消息推送
    【linux】linux修改open file 大小
    【docker】docker限制日志文件大小的方法+查看日志文件的方法
    【docker】docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志
  • 原文地址:https://www.cnblogs.com/jinloooong/p/7381282.html
Copyright © 2011-2022 走看看