一般情况下,我们并不推荐在服务端做基础的数据校验,因为这有一个很主要的问题:它加重了服务器的负载,如果并发多,这种负载就更加明显。

如果我们跟踪一个简单的Controller方法执行过程,就会发现Spring的一个http请求所需要执行的代码实在太多了。

因为这种特性,所以spring很适合用于开发一些对实时性要求不太高,单实例并发不太高的系统,或者说它适合用于开发运行于资源比较充裕的环境。

spring后续应该允许工程师做更灵活的配置--允许不加载一些不需要的,不必要的。 虽然现在已经部分有了,但是还不太够,因为它现在实在有点庞杂了。

不过既然有这个功能,也不妨用用,例如如果前端不是那么给力的情况下,可以把一些压力负载在后端上。

又或者把大部分的业务逻辑就放在后端,前端存粹就是展示而已,这样即使更换前端代码,耗费在前端的时间也比较少。

网络上有许多例子,本文仅仅是为了做个笔记,我本人并不推荐这种做法--在服务端做一些简单的数据校验。

本文例子参考了 https://blog.csdn.net/weixin_44953227/article/details/121841128

以下是本人的例子。

运行环境:springboot-2.6.7,jdk17,windows11.

验证类-ValidMessage

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext; import study.config.anno.ValidIsPositive; public class ValidMessage implements ConstraintValidator<ValidIsPositive, String> { @Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if(value==null || value.trim().equals("")) {
return true;
}
String message=value.trim();
if (message.contains("混吃等死") || message.contains("得过且过")) {
return false;
}
return true;
} }

注解-ValidIsPositive

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import javax.validation.Constraint;
import javax.validation.Payload; import study.config.validate.ValidMessage;
/**
* 验证消息是否积极
* @author lzfto
*
*/
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {ValidMessage.class})
@Documented
public @interface ValidIsPositive {
String message() default "";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}

待验证对象-SaleInfo

public class SaleInfo {

    private Integer id;
@NotNull(message = "名称不能为空")
private String name;
@DecimalMax(message = "不能大于10000", value = "10000")
private BigDecimal qty;
private BigDecimal price;
private BigDecimal totalAmount;
@ValidIsPositive(message="请拼搏")
private String comments;
private Date addTime; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public BigDecimal getQty() {
return qty;
} public void setQty(BigDecimal qty) {
this.qty = qty;
} public BigDecimal getTotalAmount() {
return totalAmount;
} public void setTotalAmount(BigDecimal totalAmount) {
this.totalAmount = totalAmount;
} public Date getAddTime() {
return addTime;
} public void setAddTime(Date addTime) {
this.addTime = addTime;
} public BigDecimal getPrice() {
return price;
} public void setPrice(BigDecimal price) {
this.price = price;
} public String getComments() {
return comments;
} public void setComments(String comments) {
this.comments = comments;
} }

控制器方法

@RequestMapping("/spring/tran/")
@Controller
public class SpringTranController { @Autowired
private SaleMainService saleMainService; @RequestMapping("/addSaleInfo")
@ResponseBody
public Object addSaleInfo(@RequestBody @Valid SaleInfo saleInfo, Errors errors) {
if (errors.getAllErrors().size() > 0) {
return ValidUtils.getValidMapInfo(errors);
} try {
if (saleInfo.getTotalAmount()==null) {
saleInfo.setTotalAmount(saleInfo.getQty().multiply(saleInfo.getPrice()));
}
return saleMainService.sale(saleInfo);
} catch (InvalidDataException e) {
return PublicReturn.getUnSuccessful(e.getMessage());
}
catch (Exception e) {
return PublicReturn.getUnSuccessful(e.getMessage());
}
}
}

js-测试代码

var settings = {
"url": "http://localhost:9999/spring/tran/addSaleInfo",
"method": "GET",
"timeout": 0,
"headers": {
"Content-Type": "application/json"
},
"data": JSON.stringify({
"name": "大米",
"qty": 10000.1,
"price": 1000,
"comments": "混吃等死"
}),
}; $.ajax(settings).done(function (response) {
console.log(response);
});

返回的结果:

{
    "comments": "请拼搏",
    "qty": "不能大于10000"
}
 

spring数据验证的更多相关文章

  1. spring(7)--注解式控制器的数据验证、类型转换及格式化

    7.1.简介 在编写可视化界面项目时,我们通常需要对数据进行类型转换.验证及格式化. 一.在Spring3之前,我们使用如下架构进行类型转换.验证及格式化: 流程: ①:类型转换:首先调用Proper ...

  2. Spring MVC 数据验证——validate注解方式

    1.说明 学习注解方式之前,应该先学习一下编码方式的spring注入.这样便于理解验证框架的工作原理.在出错的时候,也能更好的解决这个问题.所以本次博客教程也是基于编码方式.仅仅是在原来的基础加上注解 ...

  3. Spring MVC 使用介绍(十五)数据验证 (二)依赖注入与方法级别验证

    一.概述 JSR-349 (Bean Validation 1.1)对数据验证进一步进行的规范,主要内容如下: 1.依赖注入验证 2.方法级别验证 二.依赖注入验证 spring提供BeanValid ...

  4. Spring MVC 使用介绍(十三)数据验证 (一)基本介绍

    一.消息处理功能 Spring提供MessageSource接口用于提供消息处理功能: public interface MessageSource { String getMessage(Strin ...

  5. Hibernate Validation,Spring mvc 数据验证框架注解

    1.@NotNull:不能为 Null,但是可以为Empty:用在基本数据类型上. @NotNull(message="{state.notnull.valid}", groups ...

  6. spring 4.0 注解数据验证2

    在spring 4.0 注解数据验证1中有基本的数据验证方法.还是那个POJO: package com.suyin.pojo; import java.lang.reflect.Field; imp ...

  7. Spring MVC 数据验证——validate编码方式

    1.导入jar包 validation-api-1.0.0.GA.jar这是比較关键的一个jar包,主要用于解析注解@Valid. hibernate-validator-4.3.2.Final.ja ...

  8. spring mvc数据验证

    今天来说一下.前段验证,与后端数据验证.大家都知道.在我们.注册与登陆的时候,往往需要对数据进行效验.那么前段我们都知道,可以使用,js去做处理. 今天主要讲解.后端的数据效验.这里我们采用Hiber ...

  9. spring 4.0 注解数据验证1

    通常情况下,数据验证都分为前台验证,后台验证.并且前台JS验证是肯定有的,那么其实验证的错误信息根本不必通过后台传过去,哪怕就是想国际化,前台JS也能够胜任. 如果前台验证足够了,那么如果还有不正确的 ...

  10. SpringMVC数据验证

    SpringMVC数据验证——第七章 注解式控制器的数据验证.类型转换及格式化——跟着开涛学SpringMVC 资源来自:http://jinnianshilongnian.iteye.com/blo ...

随机推荐

  1. [Go] 结构体成员的第三个位置上标签的作用

    结构体成员加了第三个位置的标签,在转换指定类型时,key 会使用指定的名字. package main import ( "encoding/json" "log&quo ...

  2. 习题8 #第8章 Verilog有限状态机设计-4 #Verilog #Quartus #modelsim

    4. 用状态机设计交通灯控制器,设计要求:A路和B路,每路都有红.黄.绿三种灯,持续时间为:红灯45s,黄灯5s,绿灯40秒. A路和B路灯的状态转换是: (1) A红,B绿(持续时间40s): (2 ...

  3. Go语言—值类型和引用类型

    一.值类型 定义 变量直接存储的值,内存通常在栈中分配: var i = 5 -> i-->5 应用 int.float.bool.string.数组.struct 二.引用类型 1. 定 ...

  4. ansible(19)--ansible的playbook

    目录 1. playbook简介 2. playbook编写规范 2.1 YAML语法规范 2.2 YAML语法要素 2.3 Playbook核心元素 2.4 Playbook的基础组件 3 Play ...

  5. angualr2+ 性能优化-trackBy

    1.使用trackBy提高性能 为什么使用trackBy进行性能优化,在平时的开发中,我们对数组的处理基本都是通过接口获取新的数组进行替换或push,但是在这个过程中,Angular不知道你是要做什么 ...

  6. Python基础篇(流程控制)

    流程控制是程序运行的基础,流程控制决定了程序按照什么样的方式执行. 条件语句 条件语句一般用来判断给定的条件是否成立,根据结果来执行不同的代码,也就是说,有了条件语句,才可以根据不同的情况做不同的事, ...

  7. yum install --downloadonly

    yum install --downloadonly --downloaddir=[directory] [package] https://www.cnblogs.com/wangbaobao/p/ ...

  8. sqlserver 把 某一列的所有值 变成 in 里面的内容

    SELECT  STUFF(( SELECT  ','+'''' +convert(VARCHAR, cDefine3)+'''' from rdrecord08 where dDate>'20 ...

  9. Windows系统命令行的最佳实践

    更多博文请关注:https://blog.bigcoder.cn 每次看到Mac生态中炫酷的命令行工具,我就一脸羡慕,但是奈何财力不足,整不起动辄上万的电脑,搬砖人就只能折腾折腾手里的这台window ...

  10. FreeSWITCH使用soundtouch进行变声

    操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9   FreeSWITCH里面有个mod_soundtouch模块,支持通话实时变声,今天整理下CentOS 7环境下 ...