spring validation多层对象校验教程

目录
  • spring validation多层对象校验
    • 1、第一层对象定义
    • 2、第二层对象
    • 3、Controller层校验使用
  • validation校验对象多个字段返回的消息内容顺序随机问题
    • 问题描述
    • 解决办法

spring validation多层对象校验

1、第一层对象定义

import java.io.Serializable;
import javax.validation.Valid;
/**
 * 请求参数
 * @Title: ReqIn.java
 * @Package com.spring.pro.model
 * @Description:
 * @author ybwei
 * @date 2018年9月18日 下午1:43:26
 * @version V1.0
 */
public class ReqIn<T> implements Serializable{
 private static final long serialVersionUID = 25549320423002325L;
 /**
  * 请求头信息
  */
 private String head;
 /**
  * 请求主体信息
  */
 @Valid
 private T data;
 public String getHead() {
  return head;
 }
 public void setHead(String head) {
  this.head = head;
 }
 public T getData() {
  return data;
 }
 public void setData(T data) {
  this.data = data;
 }
}

2、第二层对象

import java.io.Serializable;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
 * @Title: User.java
 * @Package com.spring.pro.model
 * @Description:
 * @author ybwei
 * @date 2018年9月18日 下午1:46:15
 * @version V1.0
 */
public class User implements Serializable{
 private static final long serialVersionUID = 6747944028911495569L;
 private String id;
 @NotBlank
 private String name;
 @NotNull
 private Integer age;
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Integer getAge() {
  return age;
 }
 public void setAge(Integer age) {
  this.age = age;
 }
}

3、Controller层校验使用

import javax.validation.Valid;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
import com.spring.pro.model.ReqIn;
import com.spring.pro.model.User;
/**
 * @Title: UserController.java
 * @Package com.spring.pro.controller
 * @Description:
 * @author ybwei
 * @date 2018年9月18日 下午1:48:14
 * @version V1.0
 */
@RestController
public class UserController {
 private Logger logger=LoggerFactory.getLogger(getClass());

 /**
  * 校验
  * @param reqIn
  * @return
  * @author ybwei
  */
 @PostMapping("/valid")
 public HttpStatus valid(@Valid @RequestBody ReqIn<User> reqIn){
  logger.info("reqIn:{}",JSON.toJSONString(reqIn));
  return HttpStatus.OK;
 }
}

validation校验对象多个字段返回的消息内容顺序随机问题

问题描述

model中的代码如下

public class User {
  @NotNull(message = "id不能为空", groups = UserGroup.UPDATE.class)
  protected Integer id;
  /**
   * 姓名
   */
  @NotBlank(message = "请输入姓名", groups = UserGroup.ADD.class)
  private String name;
  /**
   * 性别
   */
  @NotBlank(message = "请输入性别", groups = UserGroup.ADD.class)
  private String sex;
  /**
   * 手机号
   */
  @NotBlank(message = "请输入手机号", groups = UserGroup.ADD.class)
  private String phone;
  /**
   * 邮箱
   */
  @NotBlank(message = "请输入邮箱", groups = UserGroup.ADD.class)
  private String email;
  /**
   * 公司名
   */
  @NotBlank(message = "请输入公司名", groups = UserGroup.ADD.class)
  private String companyName;
  /**
   * 职务
   */
  @NotBlank(message = "请输入职务", groups = UserGroup.ADD.class)
  private String position;
}

定义的分组接口如下

public interface UserGroup {
  interface ADD {
  }
  interface UPDATE {
  }
}

在使用Spring的@Validated注解对对象中的多个参数进行校验时,在MethodArgumentNotValidException异常拦截器处发现如果有多个条件不符和校验规则的参数,MethodArgumentNotValidException中的bindingResult.getAllErrors()异常消息集合中的数据是按照随机顺序返回的,按照正常逻辑来说,我们肯定是想要按顺序将第一个不符合规范字段错误信息返回给用户。

解决办法

经过一番搜索发现可以给类上每个验证的注解都指定不同的group,然后在创建一个interface接口添加@GroupSequence对加在字段上的那些接口进行汇总,如下:

public interface UserGroup {
  @GroupSequence({ADD.NAME.class,
                  ADD.SEX.class,
                  ADD.PHONE.class,
                  ADD.EMAIL.class,
                  ADD.COMPANY_NAME.class,
                  ADD.POSITION.class})
  interface ADD {
    interface NAME {}
    interface SEX {}
    interface PHONE {}
    interface EMAIL {}
    interface COMPANY_NAME {}
    interface POSITION {}
  }
  interface UPDATE {
  }
}

Model

@NoArgsConstructor
public class User {
  @NotNull(message = "id不能为空", groups = UserGroup.UPDATE.class)
  protected Integer id;
  /**
   * 姓名
   */
  @NotBlank(message = "请输入姓名", groups = UserGroup.ADD.NAME.class)
  private String name;
  /**
   * 性别 1.男 2.女 3.未知
   */
  @NotBlank(message = "请输入性别", groups = UserGroup.ADD.SEX.class)
  private String sex;
  /**
   * 手机号
   */
  @NotBlank(message = "请输入手机号", groups = UserGroup.ADD.PHONE.class)
  private String phone;
  /**
   * 邮箱
   */
  @NotBlank(message = "请输入邮箱", groups = UserGroup.ADD.EMAIL.class)
  private String email;
  /**
   * 公司名
   */
  @NotBlank(message = "请输入公司名", groups = UserGroup.ADD.COMPANY_NAME.class)
  private String companyName;
  /**
   * 职务
   */
  @NotBlank(message = "请输入职务", groups = UserGroup.ADD.POSITION.class)
  private String position;
}

在@GroupSequence注解中指定设置的接口数组顺序,然后在参数进行校验的时候直接在@Validated注解中放入UserGroup.ADD.class这个接口类即可public Result add(@Validated(UserGroup.ADD.class) @RequestBody User user),validation就会按照顺序返回错误信息,在异常拦截器中直接这样取出第一个错误信息即可MethodArgumentNotValidException.getBindingResult().getAllErrors().get(0).getDefaultMessage()

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot集成validation校验参数遇到的坑

    公众号中分享了一篇文章,关于SpringBoot集成validation校验参数的,粉丝留言说有坑. 原留言如下: 有坑,你试试^A-\\d{12}-\\d{4}$,这条正则经过validate这个方法无论参数写的对不对都会报验证错误,而用main方法测试是正常的.. 话说,针对这种回复我是不太信了,直觉告诉我,肯定是这位粉丝用错了.但既然粉丝有疑问还是需要专门写一个demo来验证一下的.说写就写. SpringBoot集成validation 集成过程非常简单,在原项目的pom文件中直接引入如

  • Spring 使用Validation 验证框架的问题详解

    一.介绍 Spring Validation 验证框架对参数的验证机制提供了@Validated (Spring's JSR-303 规范,是标准 JSR-303 的一个变种),javax 提供了@Valid(标准 JSR-303 规范),配合 BindingResult 可以直接提供参数验证结果.其中对于字段的特定验证注解,比如 @NotNull. 两者在检验 Controller 的入参是否符合规范时,使用@Validated 或者 @Valid 在基本验证功能上没有太多区别.但是在分组.注

  • SpringMVC实现Validation校验过程详解

    这篇文章主要介绍了SpringMVC实现Validation校验过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.概述 对前端的校验大多数通过js在页面校验,这种方法比较简单,如果对安全性考虑,还要在后台校验. springmvc使用JSR-303(javaEE6规范的一部分)校验规范,springmvc使用的是Hibernate Validator(和Hibernate的ORM) 二.步骤 2.1 引入 Hibernate Vali

  • java validation 后台参数验证的使用详解

    一.前言 在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节.比如参数不能为null,email那么必须符合email的格式,如果手动进行if判断或者写正则表达式判断无意开发效率太慢,在时间.成本.质量的博弈中必然会落后.所以把校验层抽象出来是必然的结果,下面说下几种解决方案. 二.几种解决方案 1.struts2的valid可以通过配置xml,xml中描述规则和返回的信息,这种方式比较麻烦.开发效率低,不推荐 2.validation bean 是基于JSR-303标准开发出来的,使

  • spring validation多层对象校验教程

    目录 spring validation多层对象校验 1.第一层对象定义 2.第二层对象 3.Controller层校验使用 validation校验对象多个字段返回的消息内容顺序随机问题 问题描述 解决办法 spring validation多层对象校验 1.第一层对象定义 import java.io.Serializable; import javax.validation.Valid; /** * 请求参数 * @Title: ReqIn.java * @Package com.spri

  • 如何使用Spring Validation优雅地校验参数

    引言 不知道大家平时的业务开发过程中 controller 层的参数校验都是怎么写的?是否也存在下面这样的直接判断? public String add(UserVO userVO) { if(userVO.getAge() == null){ return "年龄不能为空"; } if(userVO.getAge() > 120){ return "年龄不能超过120"; } if(userVO.getName().isEmpty()){ return &q

  • Spring Validation实现数据校验的示例

    目录 一.什么是 Spring Validation 二.实现数据校验 准备相关jar包 Validator接口方式 基于注解方式(Bean Validation) 基于方法的方式 自定义校验 一.什么是 Spring Validation 在开发中,我们经常遇到参数校验的需求,比如用户注册的时候,要校验用户名不能为空.用户名长度不超过20个字符.手机号是合法的手机号格式等等.如果使用普通方式,我们会把校验的代码和真正的业务处理逻辑耦合在一起,而且如果未来要新增一种校验逻辑也需要在修改多个地方.

  • 详解使用spring validation完成数据后端校验

    前言 数据的校验是交互式网站一个不可或缺的功能,前端的js校验可以涵盖大部分的校验职责,如用户名唯一性,生日格式,邮箱格式校验等等常用的校验.但是为了避免用户绕过浏览器,使用http工具直接向后端请求一些违法数据,服务端的数据校验也是必要的,可以防止脏数据落到数据库中,如果数据库中出现一个非法的邮箱格式,也会让运维人员头疼不已.我在之前保险产品研发过程中,系统对数据校验要求比较严格且追求可变性及效率,曾使用drools作为规则引擎,兼任了校验的功能.而在一般的应用,可以使用本文将要介绍的vali

  • Spring自带的校验框架Validation的使用实例

    1.首先来一个项目结构图以及所需jar包 可以看到,没有添加除了日志和jstl相关的jar包外,没有其他spring以外的第三方jar包(即使用的是spring自带的校验框架). 2.从前台页面开始,首先是接收用户信息的表单loginForm.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@

  • Spring boot进行参数校验的方法实例详解

    Spring boot开发web项目有时候我们需要对controller层传过来的参数进行一些基本的校验,比如非空.整数值的范围.字符串的长度.日期.邮箱等等.Spring支持JSR-303 Bean Validation API,可以方便的进行校验. 使用注解进行校验 先定义一个form的封装对象 class RequestForm { @Size(min = 1, max = 5) private String name; public String getName() { return n

  • Spring Validation方法实现原理分析

    最近要做动态数据的提交处理,即需要分析提交数据字段定义信息后才能明确对应的具体字段类型,进而做数据类型转换和字段有效性校验,然后做业务处理后提交数据库,自己开发一套校验逻辑的话周期太长,因此分析了Spring Validation的实现原理,复用了其底层花样繁多的Validator,在此将分析Spring Validation原理的过程记录下,不深入细节 如何使用Spring Validation Spring Bean初始化时校验Bean是否符合JSR-303规范 1.手动添加BeanVali

  • Spring WebFlux实现参数校验的示例代码

    请求参数校验,在实际的应用中很常见,网上的文章大部分提供的使用注解的方式做参数校验.本文主要介绍 Spring Webflux Function Endpoint 使用 Spring Validation 来校验请求的参数.使用上一篇文章的示例来演示. 使用步骤如下: 1.创建校验器 Validator 2.运用校验器 3.抛出异常,返回 http status 400 错误 PersonValidator.java package com.example.springbootdemo.webf

  • Spring Validation参数效验的各种使用姿势总结

    目录 前言 基本概念 @Valid和@Validated区别 基本使用 加入依赖 对象参数使用 使用 @RequestBody 不使用 @RequestBody 基本类型使用 测试 save方法测试 save2 get方法测试 全局异常处理 save方法测试 save2方法测试 get方法测试 其余类型 使用分组效验 定义 ZfbPayGroup 添加group 使用 group 测试 嵌套校验 集合校验 方式一 测试 方式二 测试 自定义校验规则 参考博文 总结 前言 在日常的项目开发中,为了

  • Spring BOOT AOP基础应用教程

    目录 面试课题 Spring boot AOP Spring boot 动态代理 AOP 切面 基本知识 自定义注解 自定义注解 如何在AOP引用 面试课题 Spring boot AOP Spring boot 中 AOP是其中 重要的特性,其实现的方式借助的拦截器 + Proxy 动态代理,在AOP主要用于日志打印,安全拦截,事务处理,异常处理和性能统计,要向深刻了解Spring boot AOP 原理,从 Spring 动态代理的原理讲起 Spring boot 动态代理 原理: 动态代理

随机推荐