关于spring中的validate注解后台校验的解析

在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节。比如参数不能为null,email那么必须符合email的格式,如果手动进行if判断或者写正则表达式判断无意开发效率太慢,在时间、成本、质量的博弈中必然会落后。所以把校验层抽象出来是必然的结果,下面说下几种解决方案。

1.简单的校验Demo

依赖:

<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>

Student:

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:

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();
List<String> 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> List<String> validate(T t) {
Validator validator = factory.getValidator();
Set<ConstraintViolation<T>> constraintViolations = validator.validate(t); List<String> messageList = new ArrayList<>();
for (ConstraintViolation<T> constraintViolation : constraintViolations) {
messageList.add(constraintViolation.getMessage());
}
return messageList;
}
}
2.SpringMVC中的应用:

实体类的注解还是和Student类一样,只是controller接值的时候需要做点改动如下:

// 使用@Valid 表明获取到的数据模型需要验证,传入的Errors对象就是验证出错之后的数据对象,包括校验错误的个数,具体的信息等
@RequestMapping(value="/register", method=RequestMethod.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";
}

第5章—构建Spring Web应用程序—关于spring中的validate注解后台校验的解析的更多相关文章

  1. Spring实战第五章学习笔记————构建Spring Web应用程序

    Spring实战第五章学习笔记----构建Spring Web应用程序 Spring MVC基于模型-视图-控制器(Model-View-Controller)模式实现,它能够构建像Spring框架那 ...

  2. SpringBoot学习笔记(11):使用WebSocket构建交互式Web应用程序

    SpringBoot学习笔记(11):使用WebSocket构建交互式Web应用程序 快速开始 本指南将引导您完成创建“hello world”应用程序的过程,该应用程序在浏览器和服务器之间来回发送消 ...

  3. 用 Sencha Touch 构建移动 web 应用程序

    Sencha Touch 是一个使用 HTML5.CSS3 和 JavaScript 语言构建的移动 web 应用程序框架,在本文中,学习如何应用您当前的 web 开发技能进行移动 web 开发.下载 ...

  4. 第05章-构建Spring Web应用程序

    1. Spring MVC起步 1.1 跟踪Spring MVC的请求 前端控制器DispatcherServlet 请求旅程的第一站是Spring的DispatcherServlet.与大多数基于J ...

  5. Spring学习(五)--构建Spring Web应用程序

    一.Spring MVC起步 看过猫和老鼠的小伙伴都可以想象Tom猫所制作的捕鼠器:它的目标 是发送一个小钢球,让它经过一系列稀奇古怪的装置,最后触发捕鼠 器.小钢球穿过各种复杂的配件,从一个斜坡上滚 ...

  6. 构建移动Web应用程序的技术堆栈

    编写web应用程序时,有很多的技术决策.笔者最近回来编写现代Web应用程序,并希望总结一些曾经在开发周期过程中做了记录零散的想法.这篇文章是关于一套对笔者最近开发的项目有帮助的框架.笔者重温了一些最重 ...

  7. 译自如何将Spring Cloud应用程序从Spring Boot 1.2迁移到1.3

    前言 笔者第三个Spring Cloud(版本为Spring Boot 1.2)类项目升级最新版本时遇到不少问题,本文内容是作者翻译Spring Cloud官网一位国外友人文章产生. 原文地址: Mi ...

  8. web应用程序指识别中的指纹收集

    web应用程序指纹识别是入侵前的关键步骤,假设通过指纹识别能确定web应用程序的名称及版本号.下一步就可以在网上搜索已公开的漏洞.或网上搜到其源码然后进行白盒的漏洞挖掘. 指纹识别的核心原理是通过正則 ...

  9. 第5章—构建Spring Web应用程序—SpringMVC详解

    SpringMVC详解 5.1.跟踪Springmvc的请求 SpringMVC的核心流程如下: 具体步骤: 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求 ...

随机推荐

  1. UVa 11292 Dragon of Loowater (水题,排序)

    题意:有n个条龙,在雇佣勇士去杀,每个勇士能力值为x,只能杀死头的直径y小于或等于自己能力值的龙,只能被雇佣一次,并且你要给x赏金,求最少的赏金. 析:很简单么,很明显,能力值高的杀直径大的,低的杀直 ...

  2. CentOS7+Nginx+多个Tomcat配置

    转载自:https://blog.csdn.net/name_chc/article/details/73332272:亲测可用,加了一些注释: 配置多个tomcat转发 另附上tomcat启动慢的解 ...

  3. pytest 常用命令行选项(二)

    本文接上篇继续简介pytest常用的命令行选项. 8.-v(--verbose) 选项 使用-v/--verbose选项,输出的信息会更详细.最明显的区别就是每个文件中的每个测试用例都占一行,测试的名 ...

  4. Selenium2+python自动化之读取Excel数据(xlrd)

    前言 当登录的账号有多个的时候,我们一般用excel存放测试数据,本节课介绍,python读取excel方法,并保存为字典格式. 一.环境准备 1.先安装xlrd模块,打开cmd,输入pip inst ...

  5. POJ3045 Cow Acrobats 2017-05-11 18:06 31人阅读 评论(0) 收藏

    Cow Acrobats Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4998   Accepted: 1892 Desc ...

  6. hdu 2058 The sum problem(数学题)

    一个数学问题:copy了别人的博客 #include<cstdio> #include<cstdlib> #include<cmath> int main() { ...

  7. 【转】如何使用BehaviorSDK

    原文地址:http://blogs.msdn.com/b/windows8devsupport/archive/2014/10/24/behaviorsdk.aspx 前言 在开发过程中,程序员一般通 ...

  8. MVC-1.1 BundleConfig-ScriptBundle

    App_Start中的BudleCnfig.cs中 bundles.Add(new ScriptBundle("~/bundles/jquery").Include( " ...

  9. Checkpoint--查看各DB上的脏页

    可以使用sys.dm_os_buffer_descriptors来看数据页在buffer pool中的状态,其中is_modified来标示数据页是否为脏页 --------------------- ...

  10. 排序算法之堆排序(Heapsort)解析

    一.堆排序的优缺点(pros and cons) (还是简单的说说这个,毕竟没有必要浪费时间去理解一个糟糕的的算法) 优点: 堆排序的效率与快排.归并相同,都达到了基于比较的排序算法效率的峰值(时间复 ...