spring数据验证
一般情况下,我们并不推荐在服务端做基础的数据校验,因为这有一个很主要的问题:它加重了服务器的负载,如果并发多,这种负载就更加明显。
如果我们跟踪一个简单的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);
});
返回的结果:
spring数据验证的更多相关文章
- spring(7)--注解式控制器的数据验证、类型转换及格式化
7.1.简介 在编写可视化界面项目时,我们通常需要对数据进行类型转换.验证及格式化. 一.在Spring3之前,我们使用如下架构进行类型转换.验证及格式化: 流程: ①:类型转换:首先调用Proper ...
- Spring MVC 数据验证——validate注解方式
1.说明 学习注解方式之前,应该先学习一下编码方式的spring注入.这样便于理解验证框架的工作原理.在出错的时候,也能更好的解决这个问题.所以本次博客教程也是基于编码方式.仅仅是在原来的基础加上注解 ...
- Spring MVC 使用介绍(十五)数据验证 (二)依赖注入与方法级别验证
一.概述 JSR-349 (Bean Validation 1.1)对数据验证进一步进行的规范,主要内容如下: 1.依赖注入验证 2.方法级别验证 二.依赖注入验证 spring提供BeanValid ...
- Spring MVC 使用介绍(十三)数据验证 (一)基本介绍
一.消息处理功能 Spring提供MessageSource接口用于提供消息处理功能: public interface MessageSource { String getMessage(Strin ...
- Hibernate Validation,Spring mvc 数据验证框架注解
1.@NotNull:不能为 Null,但是可以为Empty:用在基本数据类型上. @NotNull(message="{state.notnull.valid}", groups ...
- spring 4.0 注解数据验证2
在spring 4.0 注解数据验证1中有基本的数据验证方法.还是那个POJO: package com.suyin.pojo; import java.lang.reflect.Field; imp ...
- Spring MVC 数据验证——validate编码方式
1.导入jar包 validation-api-1.0.0.GA.jar这是比較关键的一个jar包,主要用于解析注解@Valid. hibernate-validator-4.3.2.Final.ja ...
- spring mvc数据验证
今天来说一下.前段验证,与后端数据验证.大家都知道.在我们.注册与登陆的时候,往往需要对数据进行效验.那么前段我们都知道,可以使用,js去做处理. 今天主要讲解.后端的数据效验.这里我们采用Hiber ...
- spring 4.0 注解数据验证1
通常情况下,数据验证都分为前台验证,后台验证.并且前台JS验证是肯定有的,那么其实验证的错误信息根本不必通过后台传过去,哪怕就是想国际化,前台JS也能够胜任. 如果前台验证足够了,那么如果还有不正确的 ...
- SpringMVC数据验证
SpringMVC数据验证——第七章 注解式控制器的数据验证.类型转换及格式化——跟着开涛学SpringMVC 资源来自:http://jinnianshilongnian.iteye.com/blo ...
随机推荐
- [ELK] Elasticsearch 安装/配置、启动/停止、加节点/重启
Elasticsearch 在不同环境上支持的安装方式很多,有源码安装.二进制安装.docker安装.rpm包等管理器安装. 具体的,根据应用的实际情况选择即可. 完成可测试开发环境的建立后,需要进一 ...
- dotnet 教你写一个可以搞炸本机所有 WCF 应用的程序方法
作为团队里面挖掘机出身的我,怎么能不多挖一些坑好将小伙伴们都埋进去呢.本文来告诉大家一个有趣且简单的方法,此方法可以将本机的 WCF 玩坏,不敢说真的搞炸本机所有 WCF 应用,但搞炸大部分基于 WC ...
- 2019-4-12-VisualStudio-好用插件集合
title author date CreateTime categories VisualStudio 好用插件集合 lindexi 2019-04-12 09:37:47 +0800 2019-0 ...
- 十、Doris操作参考手册
1.SQL参考 1.1 用户账户管理 1.2 集群管理 1.3 DDL 1.4 DML 2.函数参考 2.1 日期函数 2.2 字符串函数 2.3 聚合函数 2.4 Cast转换函数 ...
- C语言:输入一个整数并让其逆反输出。123->321
主要思想为: a)计算输入的位数有多少个 b)计算出最高位的单位(若最高位为是万位, 那么需要一个变量存储最高位数值1000) c)用取模的方法从个位数开始进行取出每一个单位上的数字 d)从个位数开始 ...
- .NET 中 Channel 类简单使用
Channel 是干什么的 The System.Threading.Channels namespace provides a set of synchronization data structu ...
- 逆向WeChat(三)
本篇在博客园地址https://www.cnblogs.com/bbqzsl/p/18198572 上篇回顾,对象是WEUIEngine.WeUIEngine使用了chrome::base框架,但只用 ...
- 【题解】A566.三点共线
题目大意,给定在平面直角坐标系中的多个点,判断有多少个三元组 \((A, B, C)\) 满足共线性质. 题目链接:A566.三点共线. 大题思路就是暴力所有的三元组,判断三个元素的斜率是否相同即可. ...
- 二:nacos 的服务注册
一:怎么引用依赖 dependencyManagement:spring cloud alibaba 的版本,由于spring cloud alibaba 还未纳入spring cloud 的主版本管 ...
- 【WPF】自定义数据集合绑定到UI界面
需要展示列表项,从https://github.com/jdscodelab/File-Manager-UI-Wpf这个项目,只有前端UI. 复用了其文件内容列表 主要源码: <StackP ...