SpringMVC中Controller使用Validation的参数校验和统一处理参数异常

来源:互联网 发布:淘宝官方店都是正品吗 编辑:程序博客网 时间:2024/05/16 08:51

Spring Validation提供一些很方便的校验功能,最近项目中正好使用,整理总结一下。

  1. 依赖的jar包, 其他spring需要的jar包我就不写了,需要的可以下载后面的demo看看。

    <dependency>   <groupId>org.hibernate</groupId>   <artifactId>hibernate-validator</artifactId>   <version>5.4.1.Final</version></dependency>
  2. 配置validator的

    可以看到,校验功能提供的类是org.hibernate.validator.HibernateValidator,被封装在了spring的校验工厂类中。messageSource可以使用也可以不用,下面会讲到。如果有自己的json转换类可以在 annotation-driven标签中配置,简单起见此处是用默认的。

    <mvc:annotation-driven validator="validator" /><bean id="validator"     class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" >   <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />   <!-- 如果不加默认到 使用classpath下的 ValidationMessages.properties -->   <property name="validationMessageSource" ref="messageSource" /></bean><bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">   <property name="basenames" value="classpath:messages" />   <property name="defaultEncoding" value="UTF-8"/>   <property name="cacheSeconds" value="60"/></bean>
  3. 利用springAOP功能,定义统一的异处理类。拦截MethodArgumentNotValidException,取出其中的错误信息,拼装成自己项目中的返回对象返回即可,Result是我自己写的一个返回对象。

    /*** @author susq* @since 2017-12-25-20:02*/@RestControllerAdvicepublic class BizExceptionHandler {   /**    * 用于处理通用异常    */   @ExceptionHandler(MethodArgumentNotValidException.class)   @ResponseStatus(HttpStatus.BAD_REQUEST)   public Result bindException(MethodArgumentNotValidException e) {       BindingResult bindingResult = e.getBindingResult();       String errorMesssage = "校验失败:";       for (FieldError fieldError : bindingResult.getFieldErrors()) {           errorMesssage += fieldError.getDefaultMessage() + ", ";       }       return new Result("00000010", errorMesssage);   }}

  4. 写Controller,注意此处,如果每个方法校验参数都加上一个BindingResult 对象来接受校验后的结果,那就不能抛出MethodArgumentNotValidException,我们这里是要统一处理而不是单独处理每一个校验结果,所以不加BindingResult让它直接抛异常。

    /*** @author susq* @since 2017-12-25-14:32*/@RestController@RequestMapping(value = "/api", produces = {"application/json;charset=utf-8"})public class TestController {   @RequestMapping(value = "/validate")   public ParamValidateVo testParam(@RequestBody @Validated ParamValidateVo vo) {       System.out.println(vo);       return vo;   }}

  5. 定义的校验规则

    /*** @author susq* @since 2017-12-25-10:57*/@Datapublic class ParamValidateVo {   @NotNull(message = "id不能为空")   private Long no;   @NotBlank(message = "name不能为空")   private String name;   @NotEmpty(message = "nums不能为空")   private List<Integer> nums;}

    如果工程里没有message文件,则直接获取在对象属性上定义的message, 如果有,可以从message文件中取自定义的信息,例如

    message.properties文件中:

    user.no.null=id不能为空

    ParamValidateVo中可以写成:

    @NotNull(message = "{usr.no.null}")   private Long no;
  6. 测试接口,可以看到,三个参数都正常的时候,返回了原本传进去的对象,否则就有错误信息输出

    入参:{"no":1,"name":"d","nums":[1,2]}返回: {   "no": 1,   "name": "d",   "nums": [       1,       2   ]}
    入参:{"name":"d","nums":[1,2]}返回: {   "code": "00000010",   "message": "校验失败:id不能为空, ",   "data": null}
    入参:{"name":"","nums":[]}返回: {   "code": "00000010",   "message": "校验失败:id不能为空, nums不能为空, name不能为空, ",   "data": null}
  7. demo地址
    ​http://download.csdn.net/download/u013041642/10173487

  8. 常用校验注解
空检查@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=) 验证字符串的长度是否在给定的范围之内,包含两端日期检查@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=) Checks whether the annotated value lies between (inclusive) the specified minimum and maximum.@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=)
  1. 可能遇到的错误
    HV000030: No validator could be found for type: java.lang.Integer.
    异常,一般去查找在类的Integer属性上加了不属于整型的校验,比如@NotEmpty,@Length等

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 嘴角 木偶纹 怎么办 肚子好涨好鼓怎么办 包茎发炎了怎么办 汽车贴膜后下雨怎么办 封釉后淋雨了怎么办 车子磨砂膜被挂怎么办 掉头发脱发怎么办 绥化图书馆怎么办卡 钢筋保护层不够怎么办 墙面有空鼓怎么办 水管老化漏水怎么办 膀胱壁增厚怎么办 腹壁疝怎么办 水龙头接口漏水怎么办 楼下墙面渗水怎么办 卫生间顶漏水怎么办 卫生间侧面漏水怎么办 卫生间防水漏水怎么办 手机芯片坏了怎么办 牙釉质缺失怎么办 牙釉质损伤怎么办 牙釉质脱落怎么办 牙釉质缺损怎么办 兔子牙太长怎么办 兔牙太长怎么办 兔子不磨牙怎么办 有牙缝了怎么办 牙缝过大怎么办 牙齿黄垢怎么办 牙齿黄刷不掉怎么办 牙齿黄黄的怎么办 牙齿里面有黄垢怎么办 牙齿有黄渍怎么办 宝宝牙齿黄怎么办 狗狗有牙结石怎么办 狗狗牙结石怎么办 长牙结石了怎么办 牙结石脱落怎么办 牙齿里面有黑垢怎么办 蛀牙引起牙痛怎么办 幼儿龋齿严重怎么办